Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何预防;“过于宽泛的例外情况”;在这种情况下?_Python_Exception_Pep8 - Fatal编程技术网

Python 如何预防;“过于宽泛的例外情况”;在这种情况下?

Python 如何预防;“过于宽泛的例外情况”;在这种情况下?,python,exception,pep8,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()) 它工作正常,但不符合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())
它工作正常,但不符合PEP8:

捕获异常时,请随时提及特定的异常 可能,而不是使用裸except:子句

例如,使用:

try:
    import platform_specific_module
except ImportError:
    platform_specific_module = None
一个简单的except:子句将捕获SystemExit和KeyboardInterrupt 异常,使使用Control-C中断程序变得更加困难, 可以掩盖其他问题。如果要捕获所有异常 表示信号程序错误,使用除外异常:(bare EXPECT是 等效于,但BaseException除外:)

一个很好的经验法则是将裸露的'except'子句的使用限制为两个 案例:

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

如果代码需要做一些清理工作,但随后让异常通过raise向上传播。尝试…最终可以做得更好 处理这个案子的方法


如何才能以良好的方式做到这一点?

您引用的《PEP8指南》建议,如果您正在记录错误,可以在您的案例中使用简单的异常。我认为您应该尽可能多地覆盖例外情况/知道如何处理,然后记录其余的情况并通过,例如

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)

你是说每个函数都会引发不同的异常吗?在except子句中命名异常类型时,它可以是引用异常的任何名称,而不仅仅是类名

例如

印刷品:

caught ValueError() when calling raise_value_error
caught TypeError() when calling raise_type_error
Traceback (most recent call last):
  File "run.py", line 14, in <module>
    function()
  File "run.py", line 8, in raise_index_error
    doesnt_exist
NameError: name 'doesnt_exist' is not defined
调用raise\u value\u error时捕获到VALUERROR() 调用raise\u type\u error时捕获到TypeError() 回溯(最近一次呼叫最后一次): 文件“run.py”,第14行,在 函数() 文件“run.py”,第8行,在raise\u index\u错误中 你不存在吗 NameError:未定义名称“不存在” 当然,这会让您不知道在每个异常发生时该做什么。但既然你只是想忽略它,继续下去,那就没问题了。

来自yourtrack.jetbrains.com:

发件人:

基本例外

所有异常都必须从中继承的超类。它的名字是 选择此选项以反映它位于异常层次结构的基础上 而作为一个例外本身。“Raisable”被认为是一个名字, 它之所以被传下去,是因为它的名字没有恰当地反映这一事实 这本身就是一个例外

BaseException的直接继承不是预期的,将是 一般情况下不鼓励。大多数用户定义的异常都应该 改为从异常继承。这就允许捕获异常以 继续在捕获所有异常的常见情况下工作 应该被抓住。BaseException的直接继承只应为 在需要一个全新的例外类别的情况下完成

但是,对于所有异常都应该被盲目捕获的情况,除了 BaseException将起作用


我认为在一些罕见的情况下,捕获一般异常是合理的,有一种方法可以欺骗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())

您可以用任何其他方法替换
ValueError
。它适合我(至少在PyCharm中是如此)。

如果您随后重新引发异常,则可以避免错误。通过这种方式,你可以进行伤害控制,而不会危及失去对其发生的跟踪。

你可以将类似于
Exception的注释作为错误:#pylint:disable=broad Exception
实际上对我有效。我希望这对你有用。

用这个来欺骗PEP8:

try:
    """code"""

except (Exception,): 
    pass

我不明白你在问什么。您希望处理哪些类型的异常?您的函数可能引发哪些异常?
异常除外:
与bare
异常除外:
不同。PEP8部分警告后者,您正在做前者。@haifzhan任何异常都可能引发,我不控制后面的代码functions@roippi不,它显示了关于
的相同投诉,例外情况除外:
除了键盘中断:raise
在这里是完全不必要的<代码>键盘中断将永远不会被
捕获,除非异常
,因为
键盘中断
源于
基本异常
,而不是
异常
。只是想要一个已知异常的示例,没有意识到
键盘中断
是一个糟糕的示例。我把它改成了一些通用的
KnownException
…一个简单的例外在这里更合适
logging.exception()
将自动记录错误并进行回溯。嘿,我在几个地方这样做,但是pylint抛出了太广泛的异常。重点是看PEP如何为这个用例建议更好的实现,而不是在IDE/linter:-)实际上,这个注释是一种简洁的说法:“我知道应该避免广泛的例外情况,但在这种情况下,我想要它,我知道我在做什么。”---如果您认为有人滥用指令,可以设置您的工作流程来搜索此类指令。
try:
    """code"""

except (Exception,): 
    pass