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()

https://stackoverflow.com/questions/2829329/

相关文章:

linux - 如何在 Linux 上使用 grep 搜索包含 DOS 行尾 (CRLF) 的文件?

linux - 如何列出(ls)目录中最后修改的 5 个文件?

linux - 如何找到某个命令的目录?

python - "for line in..."导致 UnicodeDecodeError : '

python - 计算列表差异

linux - Apache VirtualHost 403 被禁止

python - Python中的异步方法调用?

linux - 如何查看符号链接(symbolic link)的完整绝对路径

python - 如何将字符串复制到剪贴板?

linux - 如何在 Linux shell 中对变量进行除法?