1

我有这个代码 snnipet (整个程序编译和链接正确):

...
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);
    ...
}

程序试图执行的文件有语法错误,所以抛出异常。当程序尝试获取错误消息时崩溃...

该代码可以很好地处理运行时错误,但会因语法错误而崩溃。

我怎样才能得到这种错误的错误字符串?

提前致谢

4

1 回答 1

4

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

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

如果要检查异常是否为 SyntaxError,可以将 ptype 与此处列出的异常类型进行比较。

为了更具体地回答,我需要从它崩溃的地方进行回溯。

编辑

pvalue 是一个异常对象,而不是 str 实例,因此您应该使用PyObject_Str来获取异常的字符串表示形式。

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

于 2011-02-17T09:02:31.700 回答