24

对于这样的块:

try:
    #some stuff
except Exception:
    pass

pylint 引发警告 W0703 'Catch "Exception"'。为什么?

4

6 回答 6

35

通常不捕获根异常对象,而不是捕获更具体的对象(例如 IOException)被认为是一种很好的做法。

考虑是否发生内存不足异常 - 简单地使用“pass”不会让您的程序处于良好状态。

几乎唯一一次您应该捕获 Exception 是在程序的顶层,您可以(尝试)记录它,显示错误并尽可能优雅地退出。

于 2009-04-16T13:44:45.817 回答
18

最好只捕获非常窄的类型。“异常”太笼统了——您最终不仅会捕获您计划的错误,还会捕获其他错误,这可能会掩盖代码中的错误,如果它们根本没有被捕获或可能会更快地诊断出来由单个非常高级的异常处理程序更好地处理。

话虽如此,从 Python2.6 开始,捕获 Exception 变得更加合理,因为您不想捕获的所有异常(SystemExit、KeyboardInterrupt)不再继承自 Exception。相反,它们从一个常见的 BaseException 继承。这样做是为了使捕获 Exception 相对无害,因为它是如此常见的习语。

有关详细信息和未来计划,请参阅PEP 3110

于 2009-07-11T22:37:07.453 回答
4

因为它认为你抓的太多了。这是正确的。

于 2009-04-16T13:45:33.240 回答
1

当某些事情发生时引发异常......异常。程序终止通常是一件好事。

您可能想忽略一些例外情况,但 IMO 没有充分的理由捕捉这样的基类。

于 2009-04-16T13:46:09.450 回答
1

像 Greg 的回答一样,'Exception' 是一个基类,异常应该从这个类派生,另见exceptions.Exception

这里有一个非常有用的pydocs中的错误列表

还要注意非常方便的回溯模块,它允许您找出异常发生的位置。仅使用 'except: ...' 将向您显示在您的情况下最好使用的错误。例如,试试这个代码(切换评论),也许你会接受它:

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 
于 2011-07-15T23:51:56.323 回答
-1

捕获异常(不重新引发)有两个非常糟糕的副作用:错误被吃掉,所以你丢失了堆栈跟踪,而且 ctrl-c (或者你操作系统上的任何中断键)也会在这里处理。

此类程序的典型行为是它们要么无法停止,要么 ctrl-c 导致控制流向前跳过(到异常处理程序),然后继续。然后要么代码不能被中断,要么你需要敲击 ctrl-c 让它停止。

于 2009-05-03T07:37:11.870 回答