gpt4 book ai didi

python - 在 Python 中打印守护线程异常

转载 作者:太空狗 更新时间:2023-10-29 21:48:01 26 4
gpt4 key购买 nike

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 中的一个错误,除非我遗漏了文档中的某些内容。

这是一个错误,还是我遗漏了文档中的某些内容而这种行为是故意的?如果是故意的,我如何在不使用 IPython 的情况下强制 Python 在守护线程中打印回溯?

最佳答案

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

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

关于python - 在 Python 中打印守护线程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/875453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com