PyGObject GLib.MainLoop() 和异常
PyGObject GLib.MainLoop() and exceptions
我在我的 Python 应用程序中使用 PyGObject
的 GLib.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()
在不知何处调用(从 GLib
的 C
代码调用?),并且没有被 except Exception:
捕获。
是否可以捕获 GLib.MainLoop.run()
中引发的所有 Python 异常?我有很多这样调用的处理程序,所以我必须在每个处理程序中添加相同的 try: ... except OneException: ... exceptAnotherException: ...
包装器。
否,不传播异常。它被捕获并打印出来。 Python 回调中没有异常导致循环退出。
您可以通过sys.excepthook
处理这些类型的错误
我在我的 Python 应用程序中使用 PyGObject
的 GLib.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()
在不知何处调用(从 GLib
的 C
代码调用?),并且没有被 except Exception:
捕获。
是否可以捕获 GLib.MainLoop.run()
中引发的所有 Python 异常?我有很多这样调用的处理程序,所以我必须在每个处理程序中添加相同的 try: ... except OneException: ... exceptAnotherException: ...
包装器。
否,不传播异常。它被捕获并打印出来。 Python 回调中没有异常导致循环退出。
您可以通过sys.excepthook