我想知道如何获得模块/函数可以引发的异常的标准方式(如果有的话)。
我们以json
为例。
当然我去了Documentation,但我没有找到一种标准化的方法来了解在某些函数中可以引发哪些异常(例如dump
或load
)。我(乍一看)不清楚是否仅仅抓住TypeError
就足够了。
有哪些建议可以确保我们捕获关于特定模块/功能的所有内容(并且足够)?
答案 0 :(得分:3)
我从来没有完全满意Python的例外情况。它在实践中运作良好,这是困扰我的理论。 :-)特别是,因为一切都是动态的,即使你知道evil()
只提升ZorgError
本身并调用spam()
提升EggsError
,所以最多你得到通过调用evil()
时出现的这两个错误,有人可以修改背后的内容并进行更改。
也就是说,有些文档比其他文档更好。例如,如果os.kill
失败,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
{1}}?
OverflowError
如果您正在尝试编写合理的防弹代码来执行诸如读取pid文件和探测以查看进程是否正在运行之类的事情,那么事实证明您必须抓住此except:
以防pid在pid文件中是一个整数,但超出范围。如果这是在文档中(我通过酷刑测试发现它,那将是很好的。)
简单地捕捉所有内容(except Exception
或RuntimeError
)通常不合适,因为它通常捕获太多(包括例如来自堆栈溢出的ValueError
)。那么你怎么知道要抓到什么?我认为如果标准库中的叶子函数有一个&#34;例外,我可能会很好,我直接提出了#34;属性或文档要求,但它不存在。
编辑:我在上面的评论中注意到json文档明确提到了UnicodeDecodeError
。没有明确地提到,但在json的自我测试中找到的是AttributeError
(一旦你想到它就很明显)和OverflowError
(不那么明显)。该文档还提到您可以获得json.dump
。当然,如果你使用zorg()
来获取要编写的流,你也可以获得所有流的错误。这就是为什么一个例外{{1}}列表会直接引发&#34;并不总是非常有用。
答案 1 :(得分:2)
您可以使用全局类型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'