在python中捕获所有但特定的异常

时间:2019-05-14 11:49:43

标签: python python-2.7 exception

我有一个包含以下代码的代码库:

try:
    do_stuff()
except:
    print "yes, it's catching EVERYTHING"

不幸的是,我没有足够快的方法来知道会出现哪种异常类型,并且在遇到异常时无法让系统崩溃。

这使调试变得地狱。

我想通过让特定的异常漏掉(例如语法错误等)来使自己更轻松。

有可能吗?赶上一切,但有一些特定的例外?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

try:
    do_stuff()
except (SyntaxError, <any other exception>):
    raise  # simply raises the catched exception
except Exception:
    print "yes, it's catching EVERYTHING"

此外,除非确实需要,否则除非有异常说明,否则切勿使用 except,因为它也会捕获KeyboardInterruptGeneratorExit 。至少应指定Exception;参见builtin exception hierarchy


请注意,正如@tobias_k在其以下注释中所述,SyntaxError是在实际运行脚本之前检测到的,因此不需要捕获它。

对于挑战,我寻找了一种真正抓住SyntaxError的方法,我发现的唯一情况是以下情况(但还有其他情况,请参阅@brunodesthuilliers的评论):

try:
    eval(input('please enter some Python code: '))
except SyntaxError:
    print('oh yeah!')
$ python syntax_error.py
please enter some Python code: /
oh yeah!

我的结论是,如果您需要抓住SyntaxError,这意味着您的代码库做了一些比您向我们展示的还要丑的事情……我希望您有很多勇气;)