如何捕获用C编写的python模块的运行时错误?

时间:2016-03-08 02:52:18

标签: python python-c-api

假设我有一个.so形式的python模块,它包含这样的内容:

static PyObject* f(PyObject* _1, PyObject* _2) {
  int a = 0; 
  a = 1/a;
  return NULL;
}

运行后Python会崩溃。命令行提供Floating point exception: 8

我也看到了这一点:

Python Crash

这是一个错误还是可以在没有更改的情况下捕获此错误并重新编译.so文件?

1 个答案:

答案 0 :(得分:1)

现在请坐下来记住C代码在运行时的样子。它只是编译成机器代码。当你在其中除以零时,它在机器代码级上发生 - 即CPU实际尝试它,生成操作系统处理的硬件中断并最终终止你的进程。

另一方面,Python代码只是运行时的随机二进制数据,另一个代码 - 解释器 - 查看并确定要执行的操作。当你在其中除以零时,解释器会仔细检查除数并在 CPU实际尝试操作之前打印一个漂亮的回溯。 对于数组边界,对象引用等也是如此。

简而言之,在C级,没有Python解释器来照顾你。您需要自己检查输入的有效性(对于源自Python运行时的输入,但是,有一些库函数可以简化任务)。同样,如果您希望向Python运行时报告错误,您需要构建自己并将其传递给具有相关信息(异常类型和参数)的异常对象,其中还有一堆库函数。