当前位置: 首页 > 面试题库 >

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

董建茗
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我们希望在应用程序日志中跟踪这些异常-默认情况下,Java只会将它们输出到控制台。 问题答案: 在EDT中和EDT外,未捕获的异常之间存在区别。 另一个问题有一个解决方案,但是如果您只想咀嚼EDT部分的话…

  • 问题内容: 我正在研究用于并行计算JavaSeis.org的软件开发框架。我需要一个强大的机制来报告线程异常。在开发过程中,了解异常来自何处具有很高的价值,因此我想在过度报告方面犯错。我还希望能够在线程中处理Junit4测试。下面的方法是合理的还是有更好的方法? 问题答案: 我不相信在使用时有标准的“钩子”来获取这些异常。但是,如果您需要支持(听起来很合理,假设您使用),则始终可以包装Callab

  • 问题内容: 我正在使用一个称为类的类,该类可实现处理项目中的正常异常。 据我了解,此类无法捕获EDT异常,因此我尝试在该方法中使用此类来处理EDT异常: 但是直到现在,它仍无法正常工作。例如,在初始化JFrame时,我从构造器中的捆绑文件中加载其标签,如下所示: 我从捆绑文件中删除了密钥以测试异常处理程序,但是它没有用!异常通常打印在日志中。 我在这里做错什么了吗? 问题答案: EDT异常处理程序

  • 本文向大家介绍Java多线程之多线程异常捕捉,包括了Java多线程之多线程异常捕捉的使用技巧和注意事项,需要的朋友参考一下   一:为什么要单独讲多线程的异常捕捉呢? 先看个例子:   在run中手动抛出了一个运行时异常,在main中启动线程,catch语句块中捕捉下异常,捕捉到打印一句话。运行结果如下图:   发现异常被抛到了控制台,没有打印catch块中的语句。   结论:多线程运行不能按照顺

  • 我在使用ArrayBlockingQueue时遇到了生产者和消费者的情况。如果使用者线程面临异常,如何停止生产者线程。我需要生产者停止等待队列是空的。我已经诱导了一个强制运行时异常。但是程序不会退出。生产者一直在等待,因为队列是空的。有人能帮忙吗

  • 问题内容: 我有一个处理来自.NET Remoting的异步回调的Python脚本。这些回调在虚拟(工作)线程中执行。从我的回调处理程序内部,我需要调用在脚本中定义的函数,但需要在主线程中执行该函数。 主线程是将命令发送到服务器的远程客户端。其中一些命令会导致异步回调。 基本上,我需要等效于.NET的Invoke方法。这可能吗? 问题答案: 您想使用Queue(现在是python 3的队列)类来设