我正在尝试使用 pybind11 从 python 调用 C++ 函数。当直接运行时,该函数编译并运行得非常好。但是当我通过 python 调用它时,python 解释器只是崩溃,没有错误输出。
我尝试测试捕获运行时错误的方法(尝试捕获、调试器、打印语句等),但所有这些都无济于事,我无法获得任何额外的输出。不太确定是什么导致了这个问题,因为该功能已被确认可以自行工作。
一个运行时错误的示例,我不会得到任何输出。因此,对于导致相同结果(python 解释器崩溃)的不同函数,我如何知道根本原因?
C++:
void runtime_check() {
try {
int denom = 0;
cout << 1 / denom << endl;
}
catch (const exception& e) {
cout << e.what() << endl;
}
}
PYBIND11_MODULE(pybind_test, m)
{
m.def("runtime_check", &runtime_check);
}
Python:
import pybind_test as m
print("before")
try:
m.runtime_check()
except RuntimeError as e:
print(f"Caught exception in Python: {str(e)}")
print("after")
输出:
运行:python script.py
输出:
之前
(“after”没有出现,程序就结束了)
与Python相反,在C++中,整数除以零是未定义的行为。因此你的 C++ 代码会偶然运行。这是不正确的。这是带有 UB sanitizer 的相同 C++ 代码 enabled
只需将 C++ 函数实现更改为正确即可,一切都会正常工作。