如何正确忽略异常

2022-09-05 01:16:29

当你只想做一个尝试 - 除了不处理异常,你如何在Python中做到这一点?

以下是正确的方法吗?

try:
    shutil.rmtree(path)
except:
    pass

答案 1
try:
    doSomething()
except Exception: 
    pass

try:
    doSomething()
except: 
    pass

不同之处在于,第二个也会捕获 ,以及类似的东西,这些东西直接来自 ,而不是 。KeyboardInterruptSystemExitBaseExceptionException

有关详细信息,请参阅文档:

但是,捕获每个错误通常是不好的做法 - 请参阅为什么“除了:pass”是一种糟糕的编程做法?


答案 2

通常认为最佳做法是仅捕获您感兴趣的错误。在它可能是:shutil.rmtreeOSError

>>> 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找到” - 你可能不想忽略它,这可能很难调试。

如果您确实要忽略所有错误,请 catch 而不是裸语句。再说一遍,为什么?Exceptionexcept:

不指定异常会捕获每个异常,包括例如使用以下内容的异常:SystemExitsys.exit()

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

将其与正确退出的以下内容进行比较:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

如果你想写出更好的代码,OSError异常可以表示各种错误,但是在上面的例子中,我们只想忽略,所以我们可以更具体:Errno 2

import errno

try:
    shutil.rmtree(path)
except OSError as e:
    if e.errno != errno.ENOENT:
        # ignore "No such file or directory", but re-raise other errors
        raise