why

C++中处理Python的异常

            服务器用的脚本是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}

posted on 2010-11-08 16:08 why 阅读(2989) 评论(0)  编辑 收藏 引用 所属分类: 深入学习Python


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理