如何在 Python 中捕获子线程中引发的异常?

Susan Sarandon
发布: 2024-11-09 20:12:02
原创
805 人浏览过

How to Catch Exceptions Raised in Child Threads in Python?

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

在 Python 中,多线程编程在处理子线程中发生的异常方面提出了挑战。当子线程中出现异常时,它们仍然局限于该线程,使得调用者线程很难捕获和处理它们。

核心问题和理由

主要问题在于 thread_obj.start() 方法的即时性。此方法在子线程自己的上下文和堆栈中启动子线程的执行。因此,子线程中发生的任何异常都不会传播回调用者线程。

克服问题

要解决此问题,一种有效的技术涉及采用消息传递。在这种方法中,子线程和调用者线程之间建立了一个通信通道,使子线程能够向其父线程传达异常信息。

实现

下面是一个演示如何捕获子线程异常并将其显示在调用者中的示例thread:

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()
登录后复制

说明

在此示例中,ExcThread 类充当负责生成异常的子线程。 main() 函数充当调用者线程。使用queue.Queue()对象(代码中称为bucket)建立通信通道。

在ExcThread的run()方法中,发生的任何异常都会放入bucket中。调用者线程在循环中不断检查存储桶。当存储桶中存在可用异常时,将检索该异常并打印出该异常的详细信息(类型、对象和回溯)。

这种方法有效地弥合了子线程和调用者线程之间的通信差距,使后者能够捕获并处理前者产生的异常。

以上是如何在 Python 中捕获子线程中引发的异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板