我想知道如何获得模块/函数可以引发的异常的标准方法(如果有的话)。
让我们举个例子json
。自然地,我去了文档,但我没有找到一种标准化的方法来知道在某些函数(如dump
or load
)中可以引发哪些异常。我不清楚(乍一看)是否仅仅捕捉TypeError
就足够了。
哪些建议可以确保我们捕捉到有关特定模块/功能的所有内容(并且足够)?
我想知道如何获得模块/函数可以引发的异常的标准方法(如果有的话)。
让我们举个例子json
。自然地,我去了文档,但我没有找到一种标准化的方法来知道在某些函数(如dump
or load
)中可以引发哪些异常。我不清楚(乍一看)是否仅仅捕捉TypeError
就足够了。
哪些建议可以确保我们捕捉到有关特定模块/功能的所有内容(并且足够)?
我从未对 Python 的异常内容完全满意。它在实践中运行良好,这是困扰我的理论。:-) 特别是,因为一切都是动态的,即使你知道evil()
只有 raiseZorgError
自己和调用spam()
which raises EggsError
,所以最多你从调用 得到这两个错误evil()
,有人可以在你背后修补东西并改变它。
也就是说,某些文档比其他文档更好。例如,如果失败os.kill
显然可以 raise ,如果你用两个整数以外的东西调用它,但你知道它也可以 raise吗?OSError
kill
TypeError
OverflowError
>>> os.kill(9999999999999, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: signed integer is greater than maximum
如果您尝试编写合理的防弹代码来执行诸如读取 pid 文件和探测以查看进程是否正在运行之类的事情,那么您必须抓住这一点OverflowError
,以防 pid 文件中的 pid 是整数, 但超出范围。如果这在文档中会很好(我是通过酷刑测试找到的。)
简单地捕获所有东西(except:
或except Exception
)通常是不合适的,因为它通常捕获太多(包括,例如,RuntimeError
来自堆栈溢出)。那么你怎么知道要抓什么?我认为如果标准库中的叶函数具有“我直接引发的异常”属性或文档要求可能会很好,但它只是不存在。
编辑:我在上面的评论中注意到 json 文档ValueError
明确提到。没有明确指出,但在 json 的自测中发现,是UnicodeDecodeError
(一旦你想到它就很明显)和AttributeError
(不是那么明显)。该文档还提到您可以获得一个OverflowError
. 当然,如果你使用json.dump
,它需要一个要写入的流,你也可以获得流的所有错误。这种事情就是为什么“zorg()
直接引发异常列表”并不总是很有用的原因。
那么你可以使用Exception
全局类型catch
:Exceptions
try:
1 + "2"
except Exception as error:
print "Error", error
输出将类似于:
Error unsupported operand type(s) for +: 'int' and 'str'
如果您想知道该异常的名称,您可以执行以下操作:
try:
1 + "2"
except Exception as error:
print error.__class__.__name__, error
输出将类似于:
TypeError unsupported operand type(s) for +: 'int' and 'str'