在调用者线程中捕获线程的异常
在 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中文网其他相关文章!