猿问

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

在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


森栏
浏览 1969回答 3
3回答

梵蒂冈之花

问题是thread_obj.start()马上回来。您生成的子线程在自己的上下文中执行,并具有自己的堆栈。出现在子线程上下文中的任何异常都在它自己的堆栈中。我现在可以想到将这些信息传递给父线程的一种方法是使用某种消息传递,因此您可能会对此进行研究。试试这个尺寸:import sysimport threadingimport Queueclass 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:             breakif __name__ == '__main__':     main()

慕后森

这个concurrent.futures模块使在单独的线程(或进程)中工作和处理任何由此产生的异常变得简单:import concurrent.futuresimport shutildef copytree_with_dots(src_path, dst_path):     with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:         # Execute the copy on a separate thread,         # creating a future object to track progress.         future = executor.submit(shutil.copytree, src_path, dst_path)         while future.running():             # Print pretty dots here.             pass         # Return the value returned by shutil.copytree(), None.         # Raise any exceptions raised during the copy process.         return future.result()concurrent.futures包含在Python3.2中,并可作为后座futures模块用于早期版本。
随时随地看视频慕课网APP

相关分类

Python
我要回答