San*_*ero 5 python exception-handling exception
我想知道标准方式(如果有的话)如何获得模块/函数可以引发的异常.
我们举个例子json.当然我去了文档,但我没有找到一种标准化的方法来知道在某些函数(例如dump或load)中可以引发哪些异常.我(乍一看)不清楚是否只是捕捉TypeError就足够了.
哪些建议可以确保我们能够捕获关于特定模块/功能的所有内容(并且足够)?
我从来没有对 Python 的异常东西完全满意。它在实践中运作良好,令我困扰的是理论。:-) 特别是,因为一切都是动态的,即使您知道evil()只会引发ZorgError自身并调用spam()引发EggsError,因此最多您会从调用 中得到这两个错误evil(),有人可以在您背后修补并更改它。
也就是说,有些文档比其他文档更好。例如,如果失败,并且如果您使用两个整数以外的其他值来调用它,那么显然可以引发,但您知道它也可以引发os.kill吗?OSErrorkillTypeErrorOverflowError
>>> os.kill(9999999999999, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: signed integer is greater than maximum
Run Code Online (Sandbox Code Playgroud)
如果您试图编写合理的防弹代码来执行诸如读取 pid 文件并探测进程是否正在运行之类的操作,那么事实证明您必须捕获这一点,OverflowError以防 pid 文件中的 pid 是整数,但超出了范围。如果这在文档中就好了(我是通过酷刑测试找到的。)
简单地捕获所有内容(except:或except Exception)通常是不合适的,因为它通常捕获太多内容(包括例如RuntimeError堆栈溢出)。那么你怎么知道要抓什么?我认为如果标准库中的叶函数具有“我直接引发的异常”属性或文档要求,那可能会很好,但它不存在。
编辑:我在上面的评论中注意到 json 文档ValueError明确提到。没有明确指出,但在 json 的自测试中发现,是UnicodeDecodeError(一旦你考虑一下就很明显)和AttributeError(不是那么明显)。该文档还提到您可以获得一个OverflowError. 当然,如果您使用json.dump,它需要一个流来写入,您也可以获得该流的所有错误。这就是为什么“直接引发异常列表zorg()”并不总是很有用的原因。
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |