Python从包中抓取错误,找出属于哪个子库的异常。

问题描述 投票:0回答:1

我现在遇到过好几次,我想抓住一个由某个库引发的异常,但实际找到这个异常的位置需要一些时间。

例子

假设我想读取一些csv文件,除了分隔符可以是2个值之一。我会使用:

import pandas
try:
    mydf=pandas.read_csv('Somefile.csv', sep=';')
    if not someValidityChecks(mydf): raise myExc.NotValidError
except:
    mydf=pandas.read_csv('Somefile.csv', sep=',')

现在这段代码可以捕获所有的异常,但这并不是我真正想要的(这并不是 禅宗).

其实我想要的,是抓住 NotValidError以及当pandas遇到一些无效的csv时抛出的异常。ParserError.

但是 except myExc.NotValidError, ParserError 不会成功的,因为 ParserError 在我的上下文中没有定义。相反,它应该是 pandas.errors.ParserError.

这个问题

有没有什么快速的方法可以找到异常的定义?

有一个 ParserError 我应该捕捉到的错误,只要让它被抛出,就可以很容易地发现,errormessage清楚地显示了这一点。然而,要想知道这个错误的来源,我必须挖掘 stacktrace,并查看所有可能被定义的导入。

现在 pandas 并没有最复杂的结构,猜测错误可能是在 pandas.errors 并不难,但还是要花一些时间检查。其他库可能在一些比较意外的地方定义了自己的异常,或者分布在各个地方。要找出实际抛出的错误(包括包)应该很容易吧?

环境方面

我使用的是AnacondaSpyder 3.3.2,Python 3.7。

python python-3.x exception try-catch
1个回答
1
投票

快速的方法是打印异常的模块和它的限定名。

try:
    # thing that generates exception
    raise pd.errors.ParserError
except Exception as e:
    print(type(e).__module__, type(e).__qualname__)

pandas.errors ParserError
© www.soinside.com 2019 - 2024. All rights reserved.