| lidaibin ( @ 2007-04-15 03:22:00 |
| Entry tags: | c/c++, linux, python |
C代码中如何得到python脚本异常时的traceback信息
在软件项目的开发过程中,我们总是试图让程序能够适应更多的应用环境以及业务流程,不
让软件系统能够适应更多变化的方法有很多种,高度的抽象、动态链接技术等等都是一直以
#include <Python.h>
#include <compile.h>
#include <frameobject.h>
#include <traceback.h>
void
process_python_exception(void)
{
char buf[512], *buf_p = buf;
PyObject *type_obj, *value_obj, *traceback_obj;
PyErr_Fetch(&type_obj, &value_obj, &traceback_obj);
if (value_obj == NULL)
return;
if (!PyString_Check(value_obj))
return;
char *value = PyString_AsString(value_obj);
size_t szbuf = sizeof(buf);
int l;
PyCodeObject *codeobj;
l = snprintf(buf_p, szbuf, _("Error Message:\n%s"), value);
buf_p += l;
szbuf -= l;
if (traceback_obj != NULL) {
l = snprintf(buf_p, szbuf, _("\n\nTraceback:\n"));
buf_p += l;
szbuf -= l;
PyTracebackObject *traceback = (PyTracebackObject *)traceback_obj;
for (;traceback && szbuf > 0; traceback = traceback->tb_next) {
codeobj = traceback->tb_frame->f_code;
l = snprintf(buf_p, szbuf, "%s: %s(# %d)\n",
PyString_AsString(codeobj->co_name),
PyString_AsString(codeobj->co_filename),
traceback->tb_lineno);
buf_p += l;
szbuf -= l;
}
}
message_error_dialog_show(buf);
Py_XDECREF(type_obj);
Py_XDECREF(value_obj);
Py_XDECREF(traceback_obj);
}
PyErr_Fetch用来获取异常对象,并且同时可以得到traceback对象,t