如何正确地忽略异常?
当你只是想做一个尝试 - 除了没有处理异常,除了Python,你怎么做?
以下是正确的做法吗?
try:
shutil.rmtree(path)
except:
pass
try:
doSomething()
except:
pass
要么
try:
doSomething()
except Exception:
pass
不同之处在于,第一个也会捕获KeyboardInterrupt
, SystemExit
等类似的东西,它们直接来自exceptions.BaseException
,而不是exceptions.Exception
。
详情请参阅文档:
通常认为最好的做法是只捕获你感兴趣的错误。对于shutil.rmtree
,可能是OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
如果你想默默地忽略那个错误,你会这样做:
try:
shutil.rmtree(path)
except OSError:
pass
为什么? 说你(不知何故)意外地传递一个整数而不是一个字符串,如:
shutil.rmtree(2)
它会给出错误“TypeError:强制为Unicode:需要字符串或缓冲区,找到int” - 您可能不想忽略该错误,这可能很难调试。
如果您肯定要忽略所有错误,请捕获Exception
而不是纯粹的except:
语句。 同样,为什么?
不指定异常会捕获每个异常,包括例如sys.exit()
使用的SystemExit
异常:
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
将此与以下正确的退出相比较:
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
如果你想写更好的行为代码, OSError
异常可以代表各种错误,但在上面的例子中,我们只想忽略Errno 2
,所以我们可以更具体:
try:
shutil.rmtree(path)
except OSError, e:
if e.errno == 2:
# suppress "No such file or directory" error
pass
else:
# reraise the exception, as it's an unexpected error
raise
您也可以import errno
并将if
更改为if e.errno == errno.ENOENT:
当你只想做一个try catch而不处理异常时,你如何在Python中做到这一点?
这取决于你的意思是“处理”。
如果你的意思是在没有采取任何行动的情况下抓住它,你发布的代码将会起作用。
如果你的意思是你想对异常采取行动而没有停止堆栈上的异常,那么你需要这样的东西:
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
链接地址: http://www.djcxy.com/p/4391.html