Python 语法错误的异常文本(boost库)

1 投票
1 回答
1543 浏览
提问于 2025-04-16 11:59

我有一段代码片段(整个程序可以正确编译和链接):

...
try
{
    boost::python::exec_file(
        "myscript.py",            // this file contains a syntax error
        my_main_namespace, 
        my_local_namespace
    );
    return true;
}
catch(const boost::python::error_already_set &)
{
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);

    // the next line crashes on syntax error
    std::string error = boost::python::extract<std::string>(pvalue);
    ...
}

这个程序试图执行的文件有语法错误,所以抛出了一个异常。当程序尝试获取错误信息时就崩溃了……

这段代码在运行时错误时表现良好,但在语法错误时却不知为何崩溃了。

我该如何获取这类错误的错误信息呢?

提前谢谢你!

1 个回答

5

根据PyErr_Fetch的文档,即使类型对象不为NULL,值和回溯对象也可能是NULL。在尝试提取值之前,你应该先检查pvalue是否为NULL。

std::string error;
if(pvalue != NULL) {
    error = boost::python::extract<std::string>(pvalue);
}

如果你想检查这个异常是否是语法错误,可以将ptype与这里列出的异常类型进行比较。

如果要更具体地回答,我需要从崩溃的地方获取回溯信息。

编辑

pvalue是一个异常对象,而不是字符串实例,所以你应该使用PyObject_Str来获取异常的字符串表示。

你可能需要先调用PyErr_NormalizeException,将pvalue转换为正确的异常类型。

撰写回答