【问题标题】:catching all but specific exception in python在python中捕获除特定异常之外的所有异常
【发布时间】:2019-05-14 11:49:42
【问题描述】:

我有一个代码库,代码如下:

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

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

这让调试变得很糟糕。

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

这可能吗?捕捉除某些特定异常之外的所有内容?

谢谢!

【问题讨论】:

    标签: python python-2.7 exception


    【解决方案1】:

    您可以执行以下操作:

    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,这意味着你的代码库做的事情比你向我们展示的更丑陋……我希望你有很多勇气;)

    【讨论】:

    • 我认为 SyntaxError 甚至不需要,因为应该在运行程序之前检测到这些,否则,例如对NameError进行特殊处理,很好。
    • @tobias_k 我终于找到了捕捉SyntaxError的方法,请参阅编辑后的答案;)
    • @Tryph : SyntaxError 的其他候选者(py2,我留给你检查 py3 的变化):execexecfilecompileast.literal_evalast.parse等等……
    • @Tryph 哦,是的:你应该明确地将“除非没有例外规范,否则永远不应该使用例外”(就我而言,甚至在大写字母中)。在看到这部分之前,我几乎对你的帖子投了反对票。 FWIW,您应该编辑您的示例,使其实际上不使用除了 ;-)
    • @brunodesthuilliers 承认
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2012-11-11
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多