如何通过boost::python捕获最后一行错误消息

如何通过boost::python捕获最后一行错误消息,python,c++,boost,Python,C++,Boost,有没有办法从python捕获最后一行错误消息(使用msvc2008) 试试看 { boost::python::exec_文件( “someScript.py”, 主名称空间, 本地名称空间 ); 返回true; }catch(const boost::python::error\u已设置&){ 使用名称空间boost::python; PyObject*exc、*val、*tb; PyErr_Fetch(&exc,&val,&tb); boost::python::handlehexc(exc

有没有办法从python捕获最后一行错误消息(使用msvc2008)

试试看
{
boost::python::exec_文件(
“someScript.py”,
主名称空间,
本地名称空间
);
返回true;
}catch(const boost::python::error\u已设置&){
使用名称空间boost::python;
PyObject*exc、*val、*tb;
PyErr_Fetch(&exc,&val,&tb);
boost::python::handlehexc(exc)、hval(boost::python::allow_null(val))、htb(boost::python::allow_null(tb));
boost::python::对象回溯(boost::python::import(“回溯”);
boost::python::对象格式异常(traceback.attr(“格式异常”);
boost::python::object formatted_list=格式_异常(hexc、hval、htb);
boost::python::object formatted=boost::python::str(“\n”).join(格式化的\u列表);
std::string const Result=提取(格式化);
标准::cout
try
{
    boost::python::exec_file(
        "someScript.py",            
        main_namespace, 
        local_namespace
    );
    return true;
}catch(const boost::python::error_already_set &){
    using namespace boost::python;

    PyObject *exc,*val,*tb;    
    PyErr_Fetch(&exc,&val,&tb);
    boost::python::handle<> hexc(exc), hval(boost::python::allow_null(val)), htb(boost::python::allow_null(tb));
    boost::python::object traceback(boost::python::import("traceback"));

    boost::python::object format_exception(traceback.attr("format_exception"));
    boost::python::object formatted_list = format_exception(hexc, hval, htb);
    boost::python::object formatted = boost::python::str("\n").join(formatted_list);

    std::string const Result = extract<std::string>(formatted);
    std::cout<<Result<<std::endl; //pop out a lot of error messages
}
//I miss auto so much
typedef boost::container::vector<std::string>::iterator Iter;
std::string const Result = extract<std::string>(formatted);

boost::container::vector<std::string> splitted;
boost::split(splitted, Result, boost::is_any_of("\n"), boost::token_compress_on);

Iter it = std::remove(splitted.begin(), splitted.end(), "");
splitted.erase(it, splitted.end());

return splitted.back();