PyGObject GLib.MainLoop() 和异常

PyGObject GLib.MainLoop() and exceptions

我在我的 Python 应用程序中使用 PyGObjectGLib.MainLoop() 并有一个问题。

是否可以处理 loop.run() 中引发的 Python 异常?

例如,我正在使用 GLib.MainContext.invoke_full():

调用一些函数
import traceback, gi
from gi.repository import GLib

try:
    loop = GLib.MainLoop()

    def handler(self):
        print('handler')
        raise Exception('from handler with love')

    loop.get_context().invoke_full(GLib.PRIORITY_DEFAULT, handler, None)
    loop.run()

except Exception:
    print('catched!')

我认为 handler() 应该在 loop.run() 中的某处调用,所以 raise Exception('from handler with love') 应该被 except Exception: 捕获。然而,它不是:

$ python test.py 
handler
Traceback (most recent call last):
  File "test.py", line 9, in handler
    raise Exception('from handler with love')
Exception: from handler with love

似乎 handler() 在不知何处调用(从 GLibC 代码调用?),并且没有被 except Exception: 捕获。

是否可以捕获 GLib.MainLoop.run() 中引发的所有 Python 异常?我有很多这样调用的处理程序,所以我必须在每个处理程序中添加相同的 try: ... except OneException: ... exceptAnotherException: ... 包装器。

否,不传播异常。它被捕获并打印出来。 Python 回调中没有异常导致循环退出。

您可以通过sys.excepthook

处理这些类型的错误