【问题标题】:PyGObject GLib.MainLoop() and exceptionsPyGObject GLib.MainLoop() 和异常
【发布时间】:2019-02-13 09:36:45
【问题描述】:

我在我的 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 glib


    【解决方案1】:

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

    【讨论】:

    • 我们已经知道了。这就是为什么要问这个问题:如何改变它?
    • 通常未捕获的异常会导致解释器退出。由于这不会发生,因此必须有一些东西可以捕获并打印它,所以必须有一种方法通过子类化或猴子修补来覆盖它。
    【解决方案2】:

    您可以通过sys.excepthook处理这些类型的错误

    【讨论】:

    • 但是通常那个处理程序已经导致解释器退出,那么为什么它不在信号处理程序中这样做呢?它是如何被阻塞的呢?对我来说似乎是错误的,因为未处理的异常会使应用程序处于未定义状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多