多进程上的 Python sys.excepthook

KiY*_*ter 7 python error-handling python-3.x

我正在尝试sys.excepthook在多进程上设置自定义。但它不起作用。

在下面的代码中,我希望将This is my traceback function:字符串打印为错误消息的前缀,但事实并非如此。

代码:

from multiprocessing import Process
import time
import traceback
import logging
import sys

def excepthook(etype, evalue, traceback):
    traceback_strs = traceback.format_exception_only(etype, evalue)
    exception_str = "This is my traceback function:" + "\r\n".join(traceback_strs)
    print("ExceptHook")
    print(exception_str)


def subprocess_main():
    sys.excepthook = excepthook
    time.sleep(3)
    raise Exception("HelloWorld")


if __name__ == "__main__":
    p = Process(target=subprocess_main)
    p.start()
    p.join()
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?

操作系统:Windows10
Python:3.6.3

geo*_*xsh 11

sys.excepthook在有未捕获的异常时调用,但Process 具有异常处理程序例程,它在您的钩子之前消耗了异常。

如果你仍然想要自定义异常处理,你可以重写Process.run方法:

class MyProcess(Process):

    def run(self):
        try:
            super().run()
        except Exception:
            excepthook(*sys.exc_info())
Run Code Online (Sandbox Code Playgroud)

ps:traceback你的原始函数的参数excepthook隐藏了模块对象traceback,如果它被实际调用,它会触发一个错误。