如何在Python中在线程间传递异常

7 投票
1 回答
6653 浏览
提问于 2025-04-15 11:58

我需要在不同的线程之间传递异常。

我正在使用Python嵌入在一个不支持多线程的应用程序中,这个应用程序有一个线程安全的调用方式,叫做post_event(callable),它可以从主线程调用可调用的对象。

我在一个单独的线程中运行pygtk的图形界面,所以当点击按钮时,我会用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 个回答

13

#我该怎么做?我怎么存储异常信息?

可以使用 sys.exc_info()[:2],具体可以参考 这个链接

线程之间最好的沟通方式是使用 队列(Queue)。主线程可以创建一个 Queue.Queue 的实例,然后把它传给子线程;当子线程需要把信息传回主线程时,可以在这个队列上使用 .put 方法(比如,可以传一个包含线程ID、异常类型、异常值的元组——或者其他有用的信息,不一定非得是异常相关的,只要确保元组的第一个元素能标识信息的类型就行;-)。主线程可以在需要的时候用 .get 方法获取这些信息,并可以选择不同的同步方式等等。

撰写回答