【问题标题】:Python catching errors from package, finding out which sublibrary exception belongs inPython从包中捕获错误,找出属于哪个子库异常
【发布时间】:2020-09-01 10:17:45
【问题描述】:

我现在遇到过好几次我想捕获某个库引发的异常,但实际上需要一些时间才能找到该异常所在的位置。

示例

假设我想读取一些 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=',')

现在这段代码捕获了所有异常,这并不是我真正想要的(它不是 Zen)。

我真正想要的是捕获NotValidError,以及如果遇到一些无效的csv 由pandas 抛出的异常:ParserError

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

问题

是否有一些快速的方法可以找出定义异常的位置?

我应该捕获一个ParserError,只要让它被抛出就很容易找到,错误消息清楚地表明了这一点。然而,要找出错误来自哪里,我必须深入研究堆栈跟踪,并查看所有可以定义它的导入。

现在pandas 没有最复杂的结构,并且猜测错误可能在pandas.errors 中并不难,但仍然需要一些时间来检查。其他库可能在一些更意想不到的地方定义了它们的异常,或者遍布各处。找出抛出的实际错误(包括包)应该很容易,对吧?

环境

我正在使用 Anaconda/Spyder 3.3.2 和 Python 3.7

【问题讨论】:

    标签: python python-3.x exception try-catch


    【解决方案1】:

    执行此操作的快速方法是打印异常的模块及其限定名称:

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

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多