19 #include <boost/python/extract.hpp>
20 #include <boost/python/handle.hpp>
21 #include <boost/python/object.hpp>
26 namespace py = boost::python;
33 PyObject * ptype, *pvalue, *ptraceback;
34 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
35 PyErr_NormalizeException(&ptype, &pvalue, &ptraceback);
37 py::handle<> handle_type(ptype);
38 py::handle<> handle_value(pvalue);
39 py::handle<> handle_traceback(py::allow_null(ptraceback));
42 py::object err_msg_obj(py::handle<>(PyObject_Str(pvalue)));
43 std::string err_msg = py::extract<std::string>(err_msg_obj);
44 if (err_msg.
empty()) {
45 py::object err_repr_obj(py::handle<>(PyObject_Repr(pvalue)));
46 err_msg = py::extract<std::string>(err_repr_obj);
50 logger.error() <<
"Python exception " << err_msg;
53 py::object traceback(handle_traceback);
55 long lineno = py::extract<long>(traceback.attr(
"tb_lineno"));
56 std::string filename = py::extract<std::string>(traceback.attr(
"tb_frame").attr(
"f_code").attr(
"co_filename"));
57 std::string funcname = py::extract<std::string>(traceback.attr(
"tb_frame").attr(
"f_code").attr(
"co_name"));
59 logger.error() <<
"File \"" <<
filename <<
"\", line " << lineno <<
", in " << funcname;
61 traceback = traceback.attr(
"tb_next");