如何捕获用 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 运行时报告错误,你需要自己构建并向其传递一个具有相关信息(异常类型和参数)的异常对象,为此,还有一堆库函数。
假设我有一个 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 运行时报告错误,你需要自己构建并向其传递一个具有相关信息(异常类型和参数)的异常对象,为此,还有一堆库函数。