2

我正在使用 gevent 使用 python 编写的应用程序。由于我没有明确捕获的任何异常,我希望它立即退出。

看来我必须修补核心 gevent 代码。

有什么方法可以在我的应用程序中执行此操作,而无需修补 gevent 或 greenlet?

4

2 回答 2

4

您使用的是1.0beta 版,然后调整gevent.get_hub().SYSTEM_ERROR可以帮助您。SYSTEM_ERROR列出异常类型,如果被 gevent 捕获,应该在主 greenlet 中重新引发。

默认情况下,SYSTEM_ERROR(KeyboardInterrupt, SystemExit, SystemError). 其他所有未处理的异常都将被报告,但不会结束进程(除非在主greenlet中引发原始异常,在这种情况下通常会发生)。

您可以修改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_ERRORBaseException,则任何未处理的异常都将被视为致命异常。

于 2012-03-31T06:35:38.870 回答
0

您可以使用spawn_link_exception而不是spawn.

于 2013-07-25T08:56:31.913 回答