[C++-sig] Re: embedding: getting exception information?

David Abrahams dave at boost-consulting.com
Thu May 29 17:39:46 CEST 2003


"Achim Domma \(ProCoders\)" <domma at procoders.net> writes:

> Hi,
>
> I'm embedding python in a COM object and want to get the information usually
> printed via PyErr_Print. I tried code like this:
>
> dict ns(... dict of __main__ like in the example ...);
> try {
>     handle<>(PyRun_String("import non_existing_module\n",
>     Py_file_input,ns.ptr(),ns.ptr()));
> } catch (error_already_set) {
>     // try to write error information to StringIO buffer
>     PyRun_String("import traceback,sys,StringIO\n"
>     "buf = StringIO.StringIO()\n"
>     "traceback.print_tb(sys.exc_info()[2],None,buf)\n"
>     "error = buf.getvalue()\n",
>     Py_file_input,ns.ptr(),ns.ptr());
>     PyErr_Clear();
>     std::string error = extract<std::string>(ns["error"]);
> }
>
> I tried also to use extract<const char*> but in both cases I get an
> exception in this line. 

What exception, and what message is associated with it?
Are you sure that buf is a Python string?

> I first tried to get the error information using the C API, but I
> could not find a solution. Af a little bit of googling I found this
> solution, but I don't know if it's ok: There is still an active
> exception, so could I safely continue to use the interpreter to
> output the error?  

That's what Python itself does, so I'm sure it's OK... though you
probably should do it inside a try block in case there's another
exception ;-)

> Has somebody an working example on how to get the traceback or could
> point me to the right direction?

Did you look at the embedding example in
$BOOST_ROOT/libs/python/test/embedding?

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com





More information about the Cplusplus-sig mailing list