在 Python 中,多线程编程允许您同时执行任务。然而,多线程上下文中的异常处理可能具有挑战性。本文解决了一个特定问题:从父线程捕获子线程中发生的异常。
问题的出现是因为子线程有自己的上下文和堆栈独立运行。子线程中抛出的异常对于父线程不会立即可见。父线程中的传统 try- except 块(如下所示)将不起作用:
try: threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
为了解决这个问题,我们可以利用消息传递。子线程可以使用队列等共享数据结构向父线程发送异常信息。
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()
在这个例子中:
使用消息传递可以实现线程之间异常的高效通信。
以上是如何在Python中捕获父线程中的子线程异常?的详细内容。更多信息请关注PHP中文网其他相关文章!