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中的一个错误,除非我在文档中漏掉了什么。
这是一个bug吗?还是我在文档中漏掉了什么,这种行为是有意的?如果是有意的,如何在不使用IPython的情况下强制Python打印守护线程中的回溯信息?