如何找到给定库函数在Python中引发的所有异常的列表?
问题内容:
抱歉,标题太长了,但这似乎对我的问题最具描述性。
基本上,我在正式的python文档中很难找到异常信息。例如,在我当前正在编写的一个程序中,我正在使用shutil libary的move函数:
from shutil import move
move('somefile.txt', '/tmp/somefile.txt')
只要我对/ tmp /具有写访问权,就可以使用足够的磁盘空间,并且如果满足所有其他要求,那将很好。
但是,在编写通用代码时,通常很难保证这些因素,因此通常使用异常:
from shutil import move
try:
move('somefile.txt', '/tmp/somefile.txt')
except:
print 'Move failed for some reason.'
我实际上想捕获抛出的适当异常,而不仅仅是捕获 所有东西
,但是我根本找不到大多数python模块抛出的异常的列表。我有什么办法可以查看给定函数可以抛出哪些异常,为什么?这样,我可以为每个异常做出适当的案例,例如:
from shutil import move
try:
move('somefile.txt', '/tmp/somefile.txt')
except PermissionDenied:
print 'No permission.'
except DestinationDoesNotExist:
print "/tmp/ doesn't exist"
except NoDiskSpace:
print 'No diskspace available.'
答案是给那些可以将我链接到我在官方文档中以某种方式忽略的相关文档的人,或者提供一种可靠的方法来确切地找出哪些异常是由哪个函数以及为什么抛出的。
谢谢!
更新
:从给出的答案看来,实际上并没有100%的直接方法来确定特定函数引发哪些错误。使用元编程,似乎可以找出简单的情况并列出一些例外,但这并不是特别有用或方便的方法。
我想认为最终会有一些标准来定义每个python函数引发的异常,并且此信息将包含在官方文档中。在那之前,我认为我将只允许那些异常通过并为我的用户出错,因为这似乎是最理智的事情。
问题答案:
要放大Messa,请捕获您知道如何恢复的故障模式。Ian
Bicking撰写了一篇文章,其中论述了Eli
Bendersky的笔记中的一些总体原则。
示例代码的问题在于,它 没有
处理错误,只是美化它们并将其丢弃。您的代码不“知道”与NameError关联的操作,除了传递代码外,它没有什么其他应做的事情。如果您觉得必须添加细节,请查看Bicking的重新提出。
IOError和OSError对于“合理”是“可预期的”,shutil.move
但不一定可处理。函数的调用者希望它移动文件,并且如果Eli编写的“合同”被破坏,它本身可能会破坏。
捕获您可以修复的内容,修饰并重新提出您期望但无法修复的内容,并让调用者处理您所期望的内容,即使“交易”的代码在堆栈中处于七个级别main
。