假设我有一个.so
形式的python模块,它包含这样的内容:
static PyObject* f(PyObject* _1, PyObject* _2) {
int a = 0;
a = 1/a;
return NULL;
}
运行后Python会崩溃。命令行提供Floating point exception: 8
。
我也看到了这一点:
这是一个错误还是可以在没有更改的情况下捕获此错误并重新编译.so
文件?
答案 0 :(得分:1)
现在请坐下来记住C代码在运行时的样子。它只是编译成机器代码。当你在其中除以零时,它在机器代码级上发生 - 即CPU实际尝试它,生成操作系统处理的硬件中断并最终终止你的进程。
另一方面,Python代码只是运行时的随机二进制数据,另一个代码 - 解释器 - 查看并确定要执行的操作。当你在其中除以零时,解释器会仔细检查除数并在 CPU实际尝试操作之前打印一个漂亮的回溯。 对于数组边界,对象引用等也是如此。简而言之,在C级,没有Python解释器来照顾你。您需要自己检查输入的有效性(对于源自Python运行时的输入,但是,有一些库函数可以简化任务)。同样,如果您希望向Python运行时报告错误,您需要构建自己并将其传递给具有相关信息(异常类型和参数)的异常对象,其中还有一堆库函数。