如何处理特定的未捕获异常?

时间:2018-05-09 06:18:16

标签: python python-3.x exception exception-handling

我想在一个地方处理我的脚本中的一个特定异常,而不是每次 * 都使用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条款。

1 个答案:

答案 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

我认为这是你能做的最好的事情。你不能全局地忽略异常,但你可以做到这一点,所以你只需要改变它。