为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2019-07-22 16:55:38
在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
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-07-22
?
慕后森

TA贡献1802条经验 获得超5个赞

这个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模块用于早期版本。


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 1968 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信