当前位置:  开发笔记 > 编程语言 > 正文

在Python中打印Daemonic Thread Exceptions

如何解决《在Python中打印DaemonicThreadExceptions》经验,为你挑选了1个好方法。

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?



1> Joril..:

根据维基百科,根据定义,守护进程应该从控制tty中脱离,所以我认为没有显示异常是正确的(毕竟,即使你关闭启动它的shell,守护进程也应该继续工作)..
见这里.

至于如何打印回溯,我认为一个简单的try/except_then_log_to_file可以做到这一点:)

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有