【发布时间】:2020-01-30 19:19:02
【问题描述】:
我正在尝试在 C 扩展中检索异常 + 回溯打印输出。
我想做同样的事情
try:
print(0/0) # Throw a divide by zero
except:
traceback_string = traceback.format_exc()
但是在 C API 中,所以我可以将结果字符串传递给 C 端。
我的尝试如下:
PyObject *result, *output;
PyObject *Python3Traceback;
char *string;
Python3Traceback = PyImport_ImportModule("traceback");
result = PyRun_String("0/0", Py_eval_input, globals, globals);
if (result == 0) {
output = PyObject_CallMethod(Python3Traceback, "format_exc", "()");
string = PyUnicode_AsUTF8AndSize(output, &length);
}
但是,字符串总是返回值NoneType: None,这与在 except 子句之外调用 `traceback.format_exc' 相同。如何获取导致结果为 0 的异常的格式化回溯?
我也试过
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
output = PyObject_ASCII(value);
string = PyUnicode_AsUTF8AndSize(output, &length);
确实得到了正确的值,(值是字符串division by zero),但是我不知道如何获得完整的回溯打印输出。
【问题讨论】:
标签: python-3.x exception python-c-api