Python3-打印回溯并在工作异常时停止执行

Python3-打印回溯并在工作异常时停止执行,python,python-3.x,python-multithreading,Python,Python 3.x,Python Multithreading,在我的应用程序中,我使用了几个工作线程和一个mainloop,它是外部模块的一部分,不能修改。当工作线程引发异常时,应用程序应停止主循环,进行一些清理,打印工作线程异常回溯并退出。应通过引发ExitMainLoop异常来停止mainloop 下面是一个示例代码: from time import sleep from threading import Thread class MyException(BaseException): pass class ExitMainLoop(

在我的应用程序中,我使用了几个工作线程和一个mainloop,它是外部模块的一部分,不能修改。当工作线程引发异常时,应用程序应停止主循环,进行一些清理,打印工作线程异常回溯并退出。应通过引发ExitMainLoop异常来停止mainloop

下面是一个示例代码:

from time import sleep
from threading import Thread


class MyException(BaseException):
    pass


class ExitMainLoop(BaseException):
    pass


def main_loop():
    # this is a part of external module
    print('started main loop')
    try:
        while True:
            print('.')
            sleep(1)
    except ExitMainLoop:
        pass


def do_work():
    print('started worker thread')
    sleep(5)
    raise MyException


def main():
    worker = Thread(target=do_work)
    worker.daemon = True
    worker.start()
    main_loop()


if __name__ == '__main__':
    main()

编辑:我真正的问题是,我的应用程序正在使用curses用户界面的urwid库,所以我看不到工作异常。

我有一个奇怪的想法,也许可以工作

   def kill(ex_cls, ex, tb):
       os.kill(os.getpid(), signal.SIGTERM)

    sys.excepthook = kill

当发生任何异常时,获取进程id并终止它

异常不会像那样跨越线程边界。你说mainloop是你不能修改的第三方代码?它是否定义了终止循环的机制?否则,线程可能会执行类似于os.kill(os.getpid(),signal.SIGTERM)的操作。但是,除非mainloop程序有办法做到这一点,否则它不会很优雅。停止mainloop的正确方法是引发ExitMainLoop异常