Should I always call PyErr_Clear() when an exception occurs?

Jaime Wyant programmer.py at gmail.com
Tue Dec 21 12:41:09 EST 2004


On Tue, 21 Dec 2004 01:17:52 -0500, Tim Peters <tim.peters at gmail.com> wrote:
> [Jaime Wyant]
> > I've found that the code below will crash if I don't have the
> > PyErr_Clear() function call.  Should I always call PyErr_Clear()?
> 
> That's not the right approach.  Nearly all Python C API calls can
> fail.  They return a special value if they do, primarily NULL for a
> call that returns a pointer, or -1 for a call that returns an int.
> The correct thing to do is to explicitly check every call that *might*
> fail to see whether it *did* fail.  If it did, then you also have to
> explictly decide what to do about it:  either pass the exception on to
> your caller (by returning your function's error value), or suppress
> the exception via PyErr_Clear(), or replace it with another exception.
> You have to do one of those before making another Python C API call.
> Ignoring these issues always leads to bad problems eventually.
>

What exactly "happens" if I leave the exception hanging out there?  It
looked as if the garbage collector was trying to do something with
them.  Anyway, thanks big time for that paragraph above.  I don't seem
to recall the manual telling me when to call PyErr_Clear(), but I was
RTFM'n late into the night.

And you're right, programming in C stinks.   Especially for the novice
Python-C hacker who keeps having to refer to the manual to determine
if I have a borrowed or new reference!

<Snip wonderful words of wisdom!>

Thanks!
jw



More information about the Python-list mailing list