PyObject_CallObject 怎么查看返回失败的信息
时间: 2023-09-30 15:10:40 浏览: 543
在调用 `PyObject_CallObject` 函数时,如果返回值是 `NULL`,表示调用失败。此时可以通过以下方式查看返回失败的信息:
1. 使用 `PyErr_Occurred()` 函数检查是否有异常发生。如果返回值不为 `NULL`,表示有异常发生。
2. 使用 `PyErr_Fetch()` 函数获取最近一次的异常信息。该函数会返回一个指向异常类型、异常值和异常追溯信息的元组对象。如果没有异常发生,则返回 `NULL`。
3. 使用 `PyErr_NormalizeException()` 函数将异常信息标准化。该函数会将异常信息转换为标准的异常类型、异常值和异常追溯信息。如果输入参数为 `NULL`,则会使用最近一次的异常信息。
4. 使用 `PyObject_Str()` 函数将异常值转换为字符串,以便打印出来,方便调试。该函数会返回一个新的字符串对象。
下面是一个示例代码,演示如何在 `PyObject_CallObject` 调用失败时,输出异常信息:
```c
PyObject* result = PyObject_CallObject(callable_object, args);
if (result == NULL) {
PyObject *exc_type, *exc_value, *exc_traceback;
PyErr_Fetch(&exc_type, &exc_value, &exc_traceback);
PyErr_NormalizeException(&exc_type, &exc_value, &exc_traceback);
PyObject *exc_str = PyObject_Str(exc_value);
const char *exc_msg = PyUnicode_AsUTF8(exc_str);
fprintf(stderr, "Error: %s\n", exc_msg);
Py_XDECREF(exc_type);
Py_XDECREF(exc_value);
Py_XDECREF(exc_traceback);
Py_XDECREF(exc_str);
}
```
在上面的代码中,如果 `PyObject_CallObject` 调用失败,则会获取最近一次的异常信息,并将异常值转换为字符串,最后将异常信息输出到标准错误流(stderr)。注意,在使用完异常相关的对象后,需要使用 `Py_XDECREF()` 函数释放它们的引用计数。
阅读全文