Как я могу заставить приложение Gevent завершить работу сразу после любого исключения? - PullRequest
2 голосов
/ 29 марта 2012

Я работаю с приложением, написанным на Python, используя Gevent.я хочу, чтобы он немедленно завершился в результате любого исключения, которое я явно не перехватил.

похоже, я должен был бы исправить основной код gevent.

есть ли способ сделать это в моем приложении, без исправления gevent или greenlet?

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Если вы используете версию 1.0beta , то настройка gevent.get_hub().SYSTEM_ERROR может вам помочь.SYSTEM_ERROR перечисляет типы исключений, которые в случае перехвата gevent следует повторно вызывать в главном гринлете.

По умолчанию SYSTEM_ERROR равно (KeyboardInterrupt, SystemExit, SystemError).О каждом другом необработанном исключении будет только сообщено, но он не завершит процесс (если исходное исключение не вызвано в главном гринлете, в этом случае обычно происходит).

Вы можете изменить SYSTEM_ERROR:

import gevent
gevent.spawn(int, "xxx").join()  # will merely report ValueError on stderr
gevent.get_hub().SYSTEM_ERROR += (ValueError, )
gevent.spawn(int, "xxx").join()  # will report ValueError, but then it will also re-raise it

См. Источник , где определено SYSTEM_ERROR .

Если вы установите SYSTEM_ERROR в BaseException, то любое необработанное исключение будет считаться фатальным.

0 голосов
/ 25 июля 2013

Вы можете использовать spawn_link_exception вместо spawn.

...