Python原生扩展模块崩溃:解释器能否优雅地失败?

时间:2013-11-04 13:43:05

标签: python error-handling ipython cython

我开发了一个交互式数据分析工具,其中C ++高性能内核通过Cython包装并作为Python对象公开。这与IPython一起使用效果非常好。但是,扩展模块的本机代码崩溃(例如,分段错误)也会使解释器崩溃,从而导致整个会话丢失。有可能以任何方式避免这种情况吗?像分段错误这样的错误是否可以被捕获为正确的Python异常?

2 个答案:

答案 0 :(得分:1)

faulthandler module(3.3中的新增内容,但旧版本的available)可以打印系统级错误的追溯。

尝试处理Python代码apparently doesn't work中的错误。在C级,您可以为SIGSEGV安装一个信号处理程序,但是根据我能找到的信息,您可以在那里做的非常有限。基本消息似乎是你可以优雅地关闭,但你无法从段错误中恢复。

答案 1 :(得分:0)

让我补充一点,通过Cython重新引发C ++标准异常可以避免许多崩溃。这是通过将except +附加到Cython类定义来完成的。例如:

cdef extern from "../src/Example.h":
    cdef cppclass Example:
        void method() except +