PyGObject GLib.MainLoop () и исключения - PullRequest
0 голосов
/ 13 февраля 2019

Я использую GLib.MainLoop() из PyGObject в моем приложении Python и у меня есть вопрос.

Возможно ли обработать исключение Python, которое возникает в loop.run()?

ДляНапример, я вызываю некоторую функцию, используя 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:.

Можно ли перехватить все исключения Python, которые возникают в GLib.MainLoop.run()?У меня так называется дюжина обработчиков, поэтому мне нужно добавить одну и ту же оболочку try: ... except OneException: ... exceptAnotherException: ... в каждый обработчик.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы можете обработать эти типы ошибок через sys.excepthook

0 голосов
/ 13 февраля 2019

Нет, исключение не распространяется.Это поймано и напечатано.Ни одно исключение в обратном вызове Python не приводит к завершению цикла.

...