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