On Tue, 16 Oct 2007 18:55:22 +0000, Duncan Booth wrote: > Sami Vaisanen <[EMAIL PROTECTED]> wrote: > >> Hello group, >> >> I'm writing a C++ based application that embeds the python engine. Now I >> have a problem regarding exception/error information. Is there a way to >> get the exception message and possibly the traceback into a string for >> example? I've been eyeballing the PyErr_ module and it seems fairly >> limited. In other words PyErr_Print() calls the right functions for >> getting the exception information but unfortunately it is hardwired to >> print this data directly into sys.stderr, and for an embedded application >> this is completely inappropriate. >> >> >> Please advice how to do this. >> > All you have to do is call whatever functions you would call from Python. > e.g. from C you need to import traceback, then call getattr to get the > appropriate function (e.g. format_exc or format_exception), then just call > it.
void get_python_exception(string& message, string& traceback) { GIL g; PyObject* type = NULL; PyObject* value = NULL; PyObject* trace = NULL; PyErr_Fetch(&type, &value, &trace); py_ref ref_type(type); py_ref ref_value(value); py_ref ref_trace(trace); py_ref name(PyString_FromString("traceback")); py_ref module(PyImport_Import(name.get())); if (module) { py_ref fun(PyObject_GetAttrString(module.get(), "format_exc")); if (fun) { PyErr_Restore(type, value, trace); ref_type.release(); ref_value.release(); ref_trace.release(); py_ref ret(PyObject_CallObject(fun.get(), NULL)); if (ret && PyString_Check(ret.get())) { char* str = PyString_AsString(ret.get()); message = str; traceback = "traceback not available"; return; } } } message = "message not available"; traceback = "traceback not available"; } str evaluates to "None", any ideas what gives here? I've also tried to call the traceback with a different function, such as PyObject_CallFunctionObjArgs but the result is still same. Thanks -- http://mail.python.org/mailman/listinfo/python-list