KeyboardInterrupt eats my error and then won't be caught
philip at semanchuk.com
Sat Jun 20 22:30:58 CEST 2009
On Jun 20, 2009, at 7:41 AM, Piet van Oostrum wrote:
> After my previous experiment I was curious how this works with
> input(). I replaced the sem.acquire() with raw_input() and ran the
> tests. Now the inner exception is really taken so it works like the OP
> expected. The exception, however is KeyboardInterrupt, not the special
> exception from the IPC module.
> So I looked in the source code how they did it:
> The code is in Parser/myreadline.c.
> This code for input in function calls PyErr_CheckSignals() and
> PyOS_InterruptOccurred() for a proper handling of the interrupt. So it
> seems the OP should do something similar. Onl;y to deliver the custom
> error you will have to do some other stuff. I don't know what but
> calling PyErr_SetString is sufficient as it might overwrite the
> KeyboardInterrupt stuff.
Thank you Greg and especially Piet for going to the trouble of
installing posix_ipc and experimenting with it.
Piet, your research into raw_input() gave me a solution.
In my C code, I added a call to PyErr_CheckSignals() as the first line
inside the "case EINTR". Apparently calling PyErr_CheckSignals() sets
the Python error indicator -- PyErr_Occurred() returns true and the
error is PyExc_KeyboardInterrupt. I'm able to clear that error and
return my own.
Prior to adding the call to PyErr_CheckSignals(), PyErr_Occurred()
returned false, so my code had no error to clear.
Best of all, PyErr_CheckSignals() doesn't interfere with a Python-
level signal handler if one is set.
This worked under OS X and Linux.
I'll have to think some more about exactly how I want my module to
report the Ctrl-C, but at least now I have the tools to control the
Thanks again for your invaluable assistance. If I'm ever in NL or NZ
I'll buy you a beer. =)
More information about the Python-list