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

How to catch runtime error for a python module written in C?

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

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

运行Python后会崩溃。命令行给出Floating point exception: 8

我也看到了这个:

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

现在坐下来回想一下 C 代码在运行时的样子。它只是被编译成机器代码。当你在其中除以零时,它发生在 机器代码级别 - 即 CPU 实际上尝试它,生成一个硬件中断, OS 处理并最终终止你的进程。

另一方面,

Python 代码只是运行时的随机二进制数据,另一个代码(解释器)查看并确定要做什么。当你在其中除以零时,解释器会仔细检查除数并打印一个很好的回溯 before CPU 实际尝试该操作。 数组边界、对象引用等也是如此。

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