我正在使用Boost :: Python来执行一些脚本,当出现一些错误时,我会在日志窗口中显示错误消息,其中包含发生错误的行。 不幸的是,我没有设法获取SyntaxError的行号(以及此异常的子类,例如IndentationError)。
使用此答案中的代码:
https://stackoverflow.com/a/1418703/5421357
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
//pvalue contains error message
//ptraceback contains stack snapshot and many other information
//(see python traceback structure)
//Get error message
char *pStrErrorMessage = PyString_AsString(pvalue);
我设法从pvalue和ptraceback获取非语法错误异常的所有错误信息。
但是,在SyntaxError的情况下,没有回溯(ptraceback为NULL),您可以从中获取信息。
我需要知道行号,但我不确定是否可以通过Boost获取它。
有没有办法获取错误发生的行号?
这对我来说就足够了。其他信息不是必需的(例如文件),因为我已经拥有了我需要的东西(错误类型和描述)。
答案 0 :(得分:0)
我找到了一种方法:
https://stackoverflow.com/a/16806477/5421357
简而言之,要获取发生语法错误的行号:
// 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
}