我想在一个地方处理我的脚本中的一个特定异常,而不是每次 * 都使用try
/ exception
。我希望下面的代码可以做到这一点:
import sys
def handle(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, ValueError):
print("ValueError handled here and the script continues")
return
# follow default behaviour for the exception
sys.__excepthook__(exc_type, exc_value, exc_traceback)
sys.excepthook = handle
print("hello")
raise ValueError("wazaa")
print("world")
a = 1/0
这个想法是ValueError
将被处理"手动"并且脚本将继续运行(return
到脚本)。对于任何其他错误(在上述情况下为ZeroDivisionError
),将发生正常的回溯和脚本崩溃。
会发生什么
$ python scratch_13.py
hello
ValueError handled here and the script continues
Process finished with exit code 1
documentation提及(强调我的)
当引发异常并且未被捕获时,解释器会调用
sys.excepthook
有三个参数,异常类,异常 实例和回溯对象。在这个交互式会话中 在控制返回到提示之前发生; Python中的 程序会在程序退出之前发生。
这意味着当我在handler()
时,已经太晚了,因为剧本已经决定死了,我唯一的可能是影响回溯的样子。
有没有办法在脚本中全局忽略特定的异常?
* 这是一个调试上下文,通常会引发异常并使脚本崩溃(在生产中)但在某些特定情况下(例如开发平台),这个特定的异常需要只是被丢弃否则我会在可能出现问题的地方放置try
/ exception
条款。
答案 0 :(得分:0)
这样做的一种方法是使用contextlib.suppress
并拥有一个被抑制的异常的全局元组:
suppressed = (ValueError,)
然后在可能发生错误的任何地方,您只需将其包装在with suppress(*suppressed)
:
print("hello")
with suppress(*suppressed): # gets ignored
raise ValueError("wazaa")
print("world")
a = 1/0 # raise ZeroDivisionError
然后在制作中,您只需将suppressed
更改为()
:
suppressed = ()
print("hello")
with suppress(*suppressed):
raise ValueError("wazaa") # raises the error
print("world")
a = 1/0 # doesn't get executed
我认为这是你能做的最好的事情。你不能全局地忽略异常,但你可以做到这一点,所以你只需要改变它。