【发布时间】:2009-05-17 20:45:28
【问题描述】:
Python 不会打印来自守护线程中引发的异常的回溯消息。
例如,此代码创建一个守护线程并在新线程中引发异常:
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
thread.daemon = True
thread.start()
但不打印回溯。 (它没有输出)。
但是,如果线程未设置为守护线程,Python 将打印回溯。这是相同的代码,但注释掉了一行:
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
# thread.daemon = True
thread.start()
和输出:
Exception in Thread-1:
Traceback (most recent call last):
File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner
self.run()
File "C:\Python26\lib\threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
File "test.py", line 2, in error_raiser
raise Exception
Exception
在 Python 2.6.2 和 Python 3.0.1 中执行此代码并给出相同的结果。然而,有趣的是,如果我通过在 IPython shell 中导入代码来执行代码,无论线程是否为守护线程,都会显示异常。
根据文档,'daemon' 标志的唯一意义是“当只剩下守护线程时,整个 Python 程序退出。”这会让我相信,在异常之后不打印回溯是 Python 中的一个错误,除非我错过了文档中的某些内容。
这是一个错误,还是我错过了文档中的某些内容而这种行为是故意的?如果是故意的,如何强制 Python 在不使用 IPython 的情况下在守护线程中打印回溯?
【问题讨论】:
标签: python multithreading