如何在python中的线程之间传递异常

时间:2009-06-01 20:17:58

标签: python multithreading exception

我需要跨线程边界传递异常。

我正在使用嵌入非线程安全应用程序的python,该应用程序有一个线程安全调用post_event(callable),它从主线程调用callable。

我在一个单独的线程中运行pygtk gui,所以当单击一个按钮时,我使用post_event发布一个事件,并在继续之前等待它完成。但是我需要调用者知道被调用者是否抛出异常,如果是这样的话就提高它。我不太担心追溯,只是例外本身。

我的代码大致是:

class Callback():
    def __init__(self,func,*args):
        self.func=func
        self.args=args
        self.event=threading.Event()
        self.result=None
        self.exception=None
    def __call__(self):
        gtk.gdk.threads_enter()
        try:
            self.result=self.func(*self.args)
        except:
            #what do I do here? How do I store the exception?
            pass
        finally:
            gtk.gdk.threads_leave()
            self.event.set()
    def post(self):
        post_event(self)
        gtk.gdk.threads_leave()
        self.event.wait()
        gtk.gdk.threads_enter()
        if self.exception:
            raise self.exception
        return self.result

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:13)

  

#我在这做什么?如何存储例外?

使用sys.exc_info()[:2],请参阅this wiki

线程之间进行通信的最佳方式是Queue。让主线程实例化Queue.Queue实例并将其传递给子线程;当一个subthread有东西要回传给master时,它在那个队列上使用.put(例如一个带有线程id的元组,异常类型,异常值 - 或者,其他有用的信息,不一定是异常相关的,只是make确保元组的第一项标识信息的种类;-)。主人可以在需要时.get回复这些信息单元,并提供各种同步选择等等。