【发布时间】:2018-04-05 02:17:27
【问题描述】:
我有一个 python3 程序,它启动第二个线程(除了主线程)来异步处理一些事件。理想情况下,我的程序可以正常运行,并且永远不会出现未处理的异常。但是事情发生了。当/如果有异常时,我希望整个解释器以错误代码退出,就好像它是单个线程一样。这可能吗?
现在,如果生成的线程发生异常,它会打印出通常的错误信息,但不会退出。主线程继续运行。
示例
import threading
import time
def countdown(initial):
while True:
print(initial[0])
initial = initial[1:]
time.sleep(1)
if __name__ == '__main__':
helper = threading.Thread(target=countdown, args=['failsoon'])
helper.start()
time.sleep(0.5)
#countdown('THISWILLTAKELONGERTOFAILBECAUSEITSMOREDATA')
countdown('FAST')
countdown 最终将无法从字符串中访问[0],因为它已被清空,导致出现IndexError: string index out of range 错误。目标是无论主程序还是助手程序先死,整个程序一起死,但仍然输出堆栈跟踪信息。
尝试的解决方案
经过一番挖掘,我的想法是使用sys.excepthook。我添加了以下内容:
def killAll(etype, value, tb):
print('KILL ALL')
traceback.print_exception(etype, value, tb)
os.kill(os.getpid(), signal.SIGKILL)
sys.excepthook = killAll
如果主线程是第一个死掉的线程,则此方法有效。但在另一种情况下则不然。这似乎是一个已知问题 (https://bugs.python.org/issue1230540)。我会在那里尝试一些解决方法。
虽然该示例显示了我创建的主线程和辅助线程,但我对可能正在运行其他人的启动线程的库的一般情况感兴趣。
【问题讨论】:
-
你可以直接调用 sys.exit() 吗?
-
嗯...我仍然希望将正常的堆栈跟踪打印到标准错误。我是否只使用一个巨大的顶级异常处理程序?