有没有办法在没有try/except的情况下对异常提升到程序顶部?

e-s*_*tis 7 python exception

我可以捕获并转储一个异常(和相应的堆栈跟踪),这会导致程序崩溃而不执行以下操作:

try:
   # whole program
except Execption as e:
   dump(e)
   raise
Run Code Online (Sandbox Code Playgroud)

有时外部库崩溃了,我想对Python死亡做出反应并记录它的原因.我不想阻止Exception崩溃程序,我只想要调试信息.

就像是:

signals.register('dying', callback)

def callback(context):
    # dumping the exception and
    # stack trace from here
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?

Mar*_*ers 12

是的,通过注册sys.excepthook()功能:

import sys

def myexcepthook(type, value, tb):
    dump(type, value, tb)

sys.excepthook = myexcepthook
Run Code Online (Sandbox Code Playgroud)

将替换默认钩子,它会将回溯打印到stderr.每当引发未捕获的异常时都会调用它,并且解释器即将退出.

如果要从自定义挂钩重用原始异常挂钩,请调用sys.__excepthook__:

def myexcepthook(type, value, tb):
    dump(type, value, tb)
    sys.__excepthook__(type, value, tb)
Run Code Online (Sandbox Code Playgroud)