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中导入代码来执行代码,则会显示该线程是否为守护进程的异常.
根据文档,"守护进程"标志的唯一意义是"当只剩下守护进程线程时,整个Python程序退出." 这会让我相信不会在异常后打印回溯是Python中的错误,除非我遗漏了文档中的内容.
这是一个错误,还是我错过了文档中的某些内容,这种行为是故意的?如果是故意的,我如何强制Python在守护程序线程中打印回溯而不使用IPython?
根据维基百科,根据定义,守护进程应该从控制tty中脱离,所以我认为没有显示异常是正确的(毕竟,即使你关闭启动它的shell,守护进程也应该继续工作)..
见这里.
至于如何打印回溯,我认为一个简单的try/except_then_log_to_file可以做到这一点:)