exception-handling - python 在主线程的线程中引发未处理的异常?

  显示原文与译文双语对照的内容

有一些类似的问题,但没有提供我需要的答案。

如果通过 threading.Thread 创建线程,然后抛出未处理的异常,这些线程将被终止。 我希望使用堆栈跟踪将缺省打印保留在异常详细信息中,但也将整个过程带来。

在线程中,可能会捕获所有异常,并在主线程对象上使用 reraise,或者可以手动执行默认异常处理,然后在主线程上引发一个请求。

最好的方法是什么?

时间:

我写了在 python 插件中抛出异常,包括一些类似于这样的例子。

在工作线程上,执行以下( 。python 2. x, 请参见下面的python 3.x 版本):


try:


 self.result = self.do_something_dangerous()


except Exception, e:


 import sys


 self.exc_info = sys.exc_info()



在你的主线程上,你可以执行以下操作:


if self.exc_info:


 raise self.exc_info[1], None, self.exc_info[2]


return self.result



异常将出现在主线程中,就好像它在工作线程中引发一样。

python 3 。x:


try:


 self.result = self.do_something_dangerous()


except Exception as e:


 import sys


 self.exc_info = sys.exc_info()



在你的主线上:


if self.exc_info:


 raise self.exc_info[1].with_traceback(self.exc_info[2])


return self.result



次要线程在主线程中可靠地引发的唯一异常是 KeyboardInterrupt: 次要线程的方式是调用函数 thread.interrupt_main() 。 在( 关于异常的原因) 中,无法将额外的信息与异常对象关联起来,因为后者总是a的。 所以,你需要把这些信息存储在其他地方,在一个专门的例子中,比如 可以包含通过 sys.exc_info() 获得的结果,还有任何你认为有用的东西,还有你觉得有用的东西。

主线程需要恢复额外信息( 如果你在键盘中断是由用户点击控制c 或者类似的,那么队列将是空的,因此,使用 get_nowait 并准备处理 Queue.Empty 异常,例如。),按你想要的格式格式化它,然后终止( 如果所有次要线程都是 ,则在主线程终止时整个进程终止) 。

...