2012-03-28 4 views
1

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

похоже, что мне нужно будет исправить основной код gentent.

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

+1

Так что подождите, ваше приложение еще не выходит, когда сталкивается с необработанным исключением. –

+0

Да, поведение по умолчанию - это сделать это. Вы уверены, что не занимаетесь каким-то «поймать исключение» где-то, ловя все? –

ответ

3

Вы используете version 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 

См source where SYSTEM_ERROR is defined.

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

0

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