在Python中的调用者线程中捕获一个线程的异常

问题:

我对Python和多线程编程一般来说非常新鲜。基本上,我有一个脚本将文件复制到另一个位置。我想把它放在另一个线程中,所以我可以输出....来指示脚本仍在运行。
我遇到的问题是,如果文件无法复制,将会抛出异常。如果在主线程中运行,这是可以的但是,具有以下代码不起作用:

try:
    threadClass = TheThread(param1, param2, etc.)
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"

在线程类本身,我尝试重新抛出异常,但它不起作用。我看到有人在这里提出类似的问题,但他们似乎都在做比我想要做的更具体的事情(而且我不太了解所提供的解决方案)。我看到人们提到sys.exc_info()的用法,但是我不知道在哪里或如何使用它。
所有的帮助是非常感谢!
 编辑:线程类的代码如下所示:

class TheThread(threading.Thread):
    def __init__(self, sourceFolder, destFolder):
        threading.Thread.__init__(self)
        self.sourceFolder = sourceFolder
        self.destFolder = destFolder

    def run(self):
        try:
           shul.copytree(self.sourceFolder, self.destFolder)
        except:
           raise

回答:

问题是thread_obj.start()立即返回。您生成的子线程在自己的上下文中执行,并使用自己的堆栈。发生在那里的任何异常都是在子线程的上下文中,并且它在它自己的堆栈中。现在我可以想到的一种方法是将这些信息传递给父线程,就是使用某种消息传递,所以你可以看看。
尝试这个大小:

import sys
import threading
import Queue


class ExcThread(threading.Thread):

    def __init__(self, bucket):
        threading.Thread.__init__(self)
        self.bucket = bucket

    def run(self):
        try:
            raise Exception('An error occured here.')
        except Exception:
            self.bucket.put(sys.exc_info())


def main():
    bucket = Queue.Queue()
    thread_obj = ExcThread(bucket)
    thread_obj.start()

    while True:
        try:
            exc = bucket.get(block=False)
        except Queue.Empty:
            pass
        else:
            exc_type, exc_obj, exc_trace = exc
            # deal with the exception
            print exc_type, exc_obj
            print exc_trace

        thread_obj.join(0.1)
        if thread_obj.isAlive():
            continue
        else:
            break


if __name__ == '__main__':
    main()

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Catch a thread’s exception in the caller thread in Python

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 2 = 3