2.6 A Little More on Exceptions

The stated goal of this chapter is to enable the reader to write an extension providing a (procdedural) Pythonic interface to some C library. We're nearly there, but after perhaps reading the reference documentation on format strings and some of the concrete types, the big gap is the handling of errors.

We've touched on the matter of coping with exceptions: that if you detect that a function you've called has raised an exception, you should pass this on to your caller without delay. But what if the error situation is in a C library you've called? You could pass an error code back to your Python caller, but that's hardly Pythonic. We need to be able to set an exception of our own.

Also, occasionally one needs to handle exceptions raised by functions you call, i.e. to write the C equivalent of:

try:
    func()
except KeyError:
    pass

(the C equivalent of a bare except: statement is just as bad an idea in C as it is in Python. Or possibly even worse.)

Probably the most commonly used exception setting function is PyErr_SetString:

PyAPI_FUNC(void) PyErr_SetString(PyObject *exception, 
				 const char *string);

exception should be an exception class. The standard Python exception classes are all available to C code as global variables named PyExc_ and the Python name of the exception, so e.g. ArithmeticError in Python is PyExc_ArithmeticError in C. string is the error message that will be converted to a string object.

THIS DOCUMENT IS A DRAFT! Comments to mwh@python.net please.