编辑:在阅读评论和答案后,我意识到我想做的事情没有多大意义。我的想法是我 在我的代码中有一些地方可能会失败(通常是
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")
继续。
我该怎么办?
答案 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")