5

我想知道如何获得模块/函数可以引发的异常的标准方法(如果有的话)。

让我们举个例子json。自然地,我去了文档,但我没有找到一种标准化的方法来知道在某些函数(如dumpor load)中可以引发哪些异常。我不清楚(乍一看)是否仅仅捕捉TypeError就足够了。

哪些建议可以确保我们捕捉到有关特定模块/功能的所有内容(并且足够)?

4

2 回答 2

3

我从未对 Python 的异常内容完全满意。它在实践中运行良好,这是困扰我的理论。:-) 特别是,因为一切都是动态的,即使你知道evil()只有 raiseZorgError自己和调用spam()which raises EggsError,所以最多你从调用 得到这两个错误evil(),有人可以在你背后修补东西并改变它。

也就是说,某些文档比其他文档更好。例如,如果失败os.kill显然可以 raise ,如果你用两个整数以外的东西调用它,但你知道它也可以 raise吗?OSErrorkillTypeErrorOverflowError

>>> 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()直接引发异常列表”并不总是很有用的原因。

于 2013-07-16T04:03:20.907 回答
2

那么你可以使用Exception全局类型catchExceptions

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'
于 2013-07-16T02:56:52.400 回答