服务器用的脚本是Python,但是对脚本中的错误异常信息提示总是不好。有的打印不出来,有时打印的是错误的。我对此早就深恶痛绝!前几天一个由于脚本中import来的脚步语法有错,导致总是加载不成功,服务器运行不起来的问题浪费了我一上午的时间,牺牲了无数脑细胞,终于忍受不了了。用了两天多时间,终于彻底解决了这个问题,定义函数如下,如果Python脚本加载或者调用出错,调用下面这个函数就可以将错误信息记录在字符串中。
1
std::string strErrorMsg;
2
3
void log_python_exception()
4

{
5
if (!Py_IsInitialized())
6
{
7
strErrorMsg = "Python 运行环境没有初始化!";
8
return;
9
}
10
11
if (PyErr_Occurred() != NULL)
12
{
13
PyObject *type_obj, *value_obj, *traceback_obj;
14
PyErr_Fetch(&type_obj, &value_obj, &traceback_obj);
15
if (value_obj == NULL)
16
return;
17
18
strErrorMsg.clear();
19
PyErr_NormalizeException(&type_obj, &value_obj, 0);
20
if (PyString_Check(PyObject_Str(value_obj)))
21
{
22
strErrorMsg = PyString_AsString(PyObject_Str(value_obj));
23
}
24
25
if (traceback_obj != NULL)
26
{
27
strErrorMsg += "Traceback:";
28
29
PyObject * pModuleName = PyString_FromString("traceback");
30
PyObject * pTraceModule = PyImport_Import(pModuleName);
31
Py_XDECREF(pModuleName);
32
if (pTraceModule != NULL)
33
{
34
PyObject * pModuleDict = PyModule_GetDict(pTraceModule);
35
if (pModuleDict != NULL)
36
{
37
PyObject * pFunc = PyDict_GetItemString(pModuleDict,"format_exception");
38
if (pFunc != NULL)
39
{
40
PyObject * errList = PyObject_CallFunctionObjArgs(pFunc,type_obj,value_obj, traceback_obj,NULL);
41
if (errList != NULL)
42
{
43
int listSize = PyList_Size(errList);
44
for (int i=0;i < listSize;++i)
45
{
46
strErrorMsg += PyString_AsString(PyList_GetItem(errList,i));
47
}
48
}
49
}
50
}
51
Py_XDECREF(pTraceModule);
52
}
53
}
54
Py_XDECREF(type_obj);
55
Py_XDECREF(value_obj);
56
Py_XDECREF(traceback_obj);
57
}
58
}