繁体   English   中英

pylint警告'除了异常:'

[英]pylint warning on 'except Exception:'

对于像这样的块:

try:
    #some stuff
except Exception:
    pass

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

通常不会捕获根Exception对象,而是捕获更具体的对象(例如IOException),这被认为是一种好习惯。

考虑是否发生了内存不足异常 - 只需使用“pass”就不会让程序保持良好状态。

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

只捕捉非常窄范围的类型是一种好习惯。 “异常”过于笼统 - 您最终不仅会捕获您计划的错误,还会捕获其他错误,这可能会掩盖您的代码中的错误,如果它们根本没有被捕获,或者可能会更快地被诊断出来最好由一个非常高级别的异常处理程序来处理。

话虽如此,从Python2.6开始,捕获Exception已经变得更加合理,因为你不想捕获的所有异常(SystemExit,KeyboardInterrupt)都不再继承Exception。 相反,它们继承了常见的BaseException。 这是故意做的,以便使捕获异常相对无害,因为它是如此常见的习语。

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

因为它认为你抓得太多了 这是对的。

就像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'") 

当某些事情发生异常时会产生异常。 程序终止通常是件好事。

你可能想忽略一些异常,但IMO没有充分的理由去捕捉像这样的基类。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM