如何捕捉所有未捕获的异常并继续下去?

时间:2015-11-29 16:23:58

标签: python exception-handling traceback

  

编辑:在阅读评论和答案后,我意识到我想做的事情没有多大意义。我的想法是我   在我的代码中有一些地方可能会失败(通常是requests   可能不会通过的电话)我想要抓住它们而不是   到处都放try:。我的具体问题是这样的   不管他们是否失败并且不会影响其余的代码   (比如看门狗电话)。

     

我会把这个问题留给后人作为颂歌来考虑   真正的问题首先,然后问"

我正在尝试处理所有未被捕获的(否则未处理的)异常:

import traceback
import sys

def handle_exception(*exc_info):
    print("--------------")
    print(traceback.format_exception(*exc_info))
    print("--------------")

sys.excepthook = handle_exception
raise ValueError("something bad happened, but we got that covered")
print("still there")

此输出

--------------
['Traceback (most recent call last):\n', '  File "C:/Users/yop/.PyCharm50/config/scratches/scratch_40", line 10, in <module>\n    raise ValueError("something bad happened, but we got that covered")\n', 'ValueError: something bad happened, but we got that covered\n']
--------------

所以,虽然加注确实被抓住了,但它没有按照我的想法运作:拨打handle_exception,然后使用print("still there")继续。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

你不能这样做,因为Python调用sys.excepthook for uncaught exceptions

  

在交互式会话中,这发生在控制返回到提示之前;在Python程序中,这发生在程序退出之前。

无法在sys.excepthook中恢复执行程序或“压制”异常。

我能想到的最接近的是

try:
    raise ValueError("something bad happened, but we got that covered")
finally:
    print("still there")

没有except子句,因此不会捕获ValueError,但保证finally块被执行。因此,仍将调用异常钩子并打印'still there',但finally子句将在 sys.excepthook之前执行

  

如果任何条款中发生异常且未处理,则   异常暂时保存。 finally子句被执行。如果   有一个保存的异常,它会在finally的末尾重新引发   子句。

(来自here

答案 1 :(得分:0)

你好吗:

import traceback
import sys

try:
    raise ValueError("something bad happened, but we got that covered")
except Exception:
    print("--------------")
    print(traceback.format_exception(sys.exc_info()))
    print("--------------")
print("still there")