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