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

发布于 2021-02-02 23:12:53

一般而言,我对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
关注者
0
被浏览
101
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    问题是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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看