在这种情况下如何防止"过于宽泛的异常"?

Blu*_*sky 26 python exception pep8

我得到了一个可能失败的函数列表,如果一个失败,我不希望脚本停止,而是继续下一个函数.

我用这样的东西执行它:

list_of_functions = [f_a,f_b,f_c]
for current_function in list_of_functions:
    try:
        current_function()
    except Exception:
        print(traceback.format_exc())
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它不符合PEP8:

捕获异常时,请尽可能提及特定异常,而不是使用bare except子句.

例如,使用:

try:
    import platform_specific_module
except ImportError:
    platform_specific_module = None
Run Code Online (Sandbox Code Playgroud)

一个裸的except:子句将捕获SystemExit和KeyboardInterrupt异常,使得用Control-C中断程序变得更加困难,并且可以掩盖其他问题.如果要捕获发出程序错误信号的所有异常,请使用除Exception之外的内容:(裸除了除了BaseException之外).

一个好的经验法则是将裸"除"子句的使用限制为两种情况:

如果异常处理程序将打印出来或记录回溯; 至少用户会意识到发生了错误.

如果代码需要做一些清理工作,但随后让异常向上传播并加注.尝试...终于可以更好地处理这种情况.

这个好方法怎么样?

All*_*adu 54

用这个来欺骗 PEP8:

try:
    """code"""

except (Exception,): 
    pass
Run Code Online (Sandbox Code Playgroud)

  • 最干净的解决方案...仅一个额外的字符,没有任何不必要或不真实的添加。我认为这个检查是疯狂的......即使你预测了所有可能的异常,你应该总是在最后对未预测到的事情进行包罗万象......这是普遍推荐的。 (6认同)
  • except (Exception,) as e: (6认同)
  • @Yair 它为所有可能发生的错误提供了一个包罗万象的异常,而您的 IDE 不会发出任何抱怨。 (3认同)
  • 在这种情况下如何记录异常?` except (Exception as e, ):` 似乎不允许在大括号中 (2认同)

Ed *_*ith 27

您引用的PEP8指南表明,如果您记录错误,可以在您的情况下使用裸异常.我认为你应该涵盖尽可能多的例外情况,知道如何处理,然后记录其余部分pass,例如

import logging

list_of_functions = [f_a,f_b,f_c]
for current_function in list_of_functions:
    try:
        current_function()
    except KnownException:
        raise
    except Exception as e:
        logging.exception(e)
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我在几个地方这样做,但是 pylint 抛出了太广泛的异常.. (5认同)

Hus*_*hen 14

您可以发表评论,就像except Exception as error: # pylint: disable=broad-except这实际上对我有用一样。我希望它对你有用。

  • 实际上,这个评论是一种简洁的说法:“我知道应该避免广泛的例外,但在这种情况下我想要它并且我知道我在做什么。” --- 如果您认为人们滥用这些指令,您可以设置工作流程来搜索此类指令。 (3认同)

小智 13

我认为在一些罕见的情况下,捕获一般异常是合理的,并且有一种方法可以欺骗 PEP8 检查:

list_of_functions = [f_a,f_b,f_c]
for current_function in list_of_functions:
try:
    current_function()
except (ValueError, Exception):
    print(traceback.format_exc())
Run Code Online (Sandbox Code Playgroud)

您可以用ValueError任何其他替换。它对我有用(至少在 PyCharm 中)。