如何解决线程中的未标记异常
| 我有很多这样的代码def f(x):
try:
g(x)
except Exception,e:
print \"Exception %s: %d\" % (x,e)
def h(x):
thread.start_new_thread(f,(x,))
偶尔,我得到这个:
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:
与代码示例不同,这是全文。我假设在“ by”之后应该有一个线程ID,在冒号之后应该有堆栈跟踪,但是不,没有。我什至不知道如何开始调试它。
解决方法
您看到的错误表示解释器正在退出(因为主线程已退出),而另一个线程仍在执行Python代码。 Python将清理其环境,清理并丢弃所有已加载的模块(以确保执行尽可能多的终结器),但是不幸的是,这意味着仍在运行的线程在尝试使用已经存在的东西时将开始引发异常。毁了。然后该异常传播到启动线程的
start_new_thread
函数,并且它将尝试报告该异常-只是发现它尝试报告该异常的内容也消失了,这导致了令人困惑的空错误消息。
在您的特定示例中,这都是由于您的线程正在启动而您的主线程立即退出而引起的。新启动的线程是否有机会在解释器退出之前,之中或之后运行(因此,是否看到它正常运行,部分运行并报告错误或从不运行)完全取决于OS线程调度程序。
如果您正在使用线程(要避免的事情不是一件坏事),则可能要在退出解释器时不运行线程。 threading.Thread
类是启动新线程的更好接口,它将使解释器默认在退出时等待所有线程。如果您确实不想等待线程结束,则可以在Thread对象中设置其\'daemonic \'标志以获取旧的行为-包括您在此处看到的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。