如何使用Boost获取SyntaxError、NameError等的Python错误信息

如何使用Boost获取SyntaxError、NameError等的Python错误信息,python,c++,boost-python,Python,C++,Boost Python,我正在使用Boost::Python执行一些脚本,当出现一些错误时,我会在日志窗口中显示错误消息,并显示错误发生的行。 不幸的是,我无法获得SyntaxError(以及此异常的子类,如IndentationError)的行号 使用此答案中的代码: 我设法从pvalue和ptraceback中获取非语法错误异常的所有错误信息 但是,对于SyntaxError,没有可从中获取信息的回溯(ptraceback为NULL) 我需要知道线路号,但我不确定是否可以通过Boost获得 有没有办法获取发生错误

我正在使用Boost::Python执行一些脚本,当出现一些错误时,我会在日志窗口中显示错误消息,并显示错误发生的行。 不幸的是,我无法获得SyntaxError(以及此异常的子类,如IndentationError)的行号

使用此答案中的代码:

我设法从pvalue和ptraceback中获取非语法错误异常的所有错误信息

但是,对于SyntaxError,没有可从中获取信息的回溯(ptraceback为NULL)

我需要知道线路号,但我不确定是否可以通过Boost获得

有没有办法获取发生错误的行号?


我只要有电话号码就够了。其他信息是不必要的(例如文件),因为我已经有了我需要的信息(错误类型和描述)。

我在这里找到了一种可行的方法:

简而言之,要获取发生语法错误的行号,请执行以下操作:

// Init code here ...

PyObject *res = PyRun_String(script_source,Py_file_input,main_dict,main_dict);      
if(res == NULL)
{
    PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL;
    PyErr_Fetch(&ptype,&pvalue,&ptraceback);
    PyErr_NormalizeException(&ptype,&pvalue,&ptraceback);

    char *msg, *file, *text;  
    int line, offset;  

    int res = PyArg_ParseTuple(pvalue,"s(siis)",&msg,&file,&line,&offset,&text);

    PyObject* line_no = PyObject_GetAttrString(pvalue,"lineno");
    PyObject* line_no_str = PyObject_Str(line_no);
    PyObject* line_no_unicode = PyUnicode_AsEncodedString(line_no_str,"utf-8", "Error");
    char *actual_line_no = PyBytes_AsString(line_no_unicode);  // Line number        
}
// Init code here ...

PyObject *res = PyRun_String(script_source,Py_file_input,main_dict,main_dict);      
if(res == NULL)
{
    PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL;
    PyErr_Fetch(&ptype,&pvalue,&ptraceback);
    PyErr_NormalizeException(&ptype,&pvalue,&ptraceback);

    char *msg, *file, *text;  
    int line, offset;  

    int res = PyArg_ParseTuple(pvalue,"s(siis)",&msg,&file,&line,&offset,&text);

    PyObject* line_no = PyObject_GetAttrString(pvalue,"lineno");
    PyObject* line_no_str = PyObject_Str(line_no);
    PyObject* line_no_unicode = PyUnicode_AsEncodedString(line_no_str,"utf-8", "Error");
    char *actual_line_no = PyBytes_AsString(line_no_unicode);  // Line number        
}