线程内未捕获的异常是否只会杀死线程或整个进程?

时间:2012-11-22 13:21:44

标签: python multithreading exception

如果在线程内部引发异常而没有在其他地方捕获它,那么它会终止整个应用程序/解释器/进程吗?或者它只会杀死线程?

2 个答案:

答案 0 :(得分:12)

我们试一试:

import threading
import time

class ThreadWorker(threading.Thread):

    def run(self):
        print "Statement from a thread!"
        raise Dead


class Main:

    def __init__(self):
        print "initializing the thread"
        t = ThreadWorker()
        t.start()
        time.sleep(2)
        print "Did it work?"


class Dead(Exception): pass



Main()

上面的代码产生以下结果:

> initializing the thread 
> Statement from a thread! 
> Exception in thread
> Thread-1: Traceback (most recent call last):   File
> "C:\Python27\lib\threading.py", line 551, in __bootstrap_inner
>     self.run()   File ".\pythreading.py", line 8, in run
>     raise Dead Dead
> ----- here the interpreter sleeps for 2 seconds -----
> Did it work?

所以,你的问题的答案是,一个引发的Exception只会崩溃它所在的线程,而不是整个程序。

答案 1 :(得分:6)

来自threading文档:

  

一旦线程的活动开始,就会考虑线程   '活'。当run()方法终止时它停止活动 -   通常,或通过提出未处理的例外。 is_alive()   方法测试线程是否存活。

还有:

  

加入(超时=无)

     

等到线程终止。这会阻塞调用线程,直到调用join()方法的线程终止 - 或者   通常或通过未处理的例外 - 或直到可选   发生超时。

换句话说,未捕获的异常是一种结束线程的方法,并且将在所述线程的父级join调用中被检测到。