12

If I do (e.g.)

 open("/snafu/fnord")

in Python (and the file does not exist), I get a traceback and the message

 IOError: [Errno 2] No such file or directory: '/snafu/fnord'

I would like to get the above string with Python's C API (i.e., a Python interpreter embedded in a C program). I need it as a string, not output to the console.

With PyErr_Fetch() I can get the type object of the exception and the value. For the above example, the value is a tuple:

 (2, 'No such file or directory', '/snafu/fnord')

Is there an easy way from the information I get from PyErr_Fetch() to the string the Python interpreter shows? (One that does not involve to construct such strings for each exception type yourself.)

1 Answer 1

9

I think that Python exceptions are printed by running "str()" on the exception instance, which will return the formatted string you're interested in. You can get this from C by calling the PyObject_Str() method described here:

https://docs.python.org/c-api/object.html

Good luck!

Update: I'm a bit confused why the second element being returned to you by PyErr_Fetch() is a string. My guess is that you are receiving an "unnormalized exception" and need to call PyErr_NormalizeException() to turn that tuple into a "real" Exception that can format itself as a string like you want it to.

Sign up to request clarification or add additional context in comments.

2 Comments

The second argument is a tuple and not a string. And I already call PyErr_NormalizeException(). But PyErr_Fetch() does not return an exception object, only the exception type. So I have to create the exception object myself, I guess? And I pass the second argument of PyErr_Fetch() to the constructor?
Oh, just checked my code and I did not call PyErr_NormalizeException() in all cases. Calling it, indeed turns the second argument into an exception object. And converting that one to a string with PyObject_Str() gets me the desired result. Thanks a lot.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.