对于这样的块:
try:
#some stuff
except Exception:
pass
pylint引发警告W0703'Catch“Exception”'。为什么呢?
答案 0 :(得分:27)
通常不会捕获根Exception对象,而是捕获更具体的对象 - 例如IOException。
考虑是否发生了内存不足异常 - 只需使用“pass”就不会让程序保持良好状态。
几乎唯一一次你应该捕获异常是在你的程序的顶层,你可以(尝试)记录它,显示错误,并尽可能优雅地退出。
答案 1 :(得分:17)
最好只捕捉一小部分类型。 “异常”过于笼统 - 您最终不仅会捕获您计划的错误,还会捕获其他错误,这可能会掩盖您的代码中的错误,如果它们根本没有被捕获,或者可能会更快地被诊断出来最好由一个非常高级别的异常处理程序来处理。
话虽如此,自Python2.6以来,捕获Exception变得更加合理,因为您不想捕获的所有异常(SystemExit,KeyboardInterrupt)不再继承Exception。相反,它们继承了常见的BaseException。这是故意做的,以使捕获异常相对无害,因为它是如此常见的习语。
有关详细信息,请参阅PEP 3110。未来的计划。
答案 2 :(得分:3)
因为它认为你抓得太多了。这是对的。
答案 3 :(得分:1)
当出现异常情况时会引发异常。程序终止通常是一件好事。
你可能想忽略一些异常,但IMO没有充分的理由去捕捉像这样的基类。
答案 4 :(得分:1)
这是<{3}}
中非常有用的错误列表还要注意非常方便的回溯模块,它允许您找出发生异常的位置。仅使用&#39;除了:...&#39;将告诉你在你的情况下你应该最好使用什么错误。例如,尝试此代码(切换评论),也许您会接受它:
import traceback
#absent = 'nothing'
try:
something = absent
except NameError:
traceback.print_exc()
else:
print("you get here only when you uncomment 'absent'")
答案 5 :(得分:-1)
捕获异常(没有重新提升)有两个非常糟糕的副作用:错误被吃掉,所以你丢失了堆栈跟踪,而且ctrl-c(或者操作系统上的任何中断键)也被处理掉了这里。
这样的程序的典型行为是它们无法停止,或者ctrl-c导致控制流向前跳转(到异常处理程序),然后继续。然后,代码不能被中断,或者你需要锤击ctrl-c以使其停止。