如何正确忽略异常
2022-09-05 01:16:29
当你只想做一个尝试 - 除了不处理异常,你如何在Python中做到这一点?
以下是正确的方法吗?
try:
shutil.rmtree(path)
except:
pass
当你只想做一个尝试 - 除了不处理异常,你如何在Python中做到这一点?
以下是正确的方法吗?
try:
shutil.rmtree(path)
except:
pass
try:
doSomething()
except Exception:
pass
或
try:
doSomething()
except:
pass
不同之处在于,第二个也会捕获 ,以及类似的东西,这些东西直接来自 ,而不是 。KeyboardInterrupt
SystemExit
BaseException
Exception
有关详细信息,请参阅文档:
但是,捕获每个错误通常是不好的做法 - 请参阅为什么“除了:pass”是一种糟糕的编程做法?
通常认为最佳做法是仅捕获您感兴趣的错误。在它可能是: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找到” - 你可能不想忽略它,这可能很难调试。
如果您确实要忽略所有错误,请 catch 而不是裸语句。再说一遍,为什么?Exception
except:
不指定异常会捕获每个异常,包括例如使用以下内容的异常:SystemExit
sys.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