PyGObject GLib.MainLoop()和异常

时间:2019-02-13 09:36:45

标签: python glib

我在Python应用程序中使用GLib.MainLoop()中的PyGObject,并且有疑问。

是否可以处理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()在茫茫荒野中被调用(是从GLib的{​​{1}}代码中调用的?),而没有被C捕获。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以通过sys.excepthook

处理这些类型的错误。