我现在遇到过好几次,我想抓住一个由某个库引发的异常,但实际找到这个异常的位置需要一些时间。
假设我想读取一些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。
快速的方法是打印异常的模块和它的限定名。
try:
# thing that generates exception
raise pd.errors.ParserError
except Exception as e:
print(type(e).__module__, type(e).__qualname__)
pandas.errors ParserError