resume execution after catching with an excepthook?
Hans Mulder
hansmu at xs4all.nl
Thu Oct 25 11:31:26 EDT 2012
On 24/10/12 14:51:30, andrea crotti wrote:
> So I would like to be able to ask for confirmation when I receive a C-c,
> and continue if the answer is "N/n".
>
> I'm already using an exception handler set with sys.excepthook, but I
> can't make it work with the confirm_exit, because it's going to quit in
> any case..
>
> A possible solution would be to do a global "try/except
> KeyboardInterrupt", but since I already have an excepthook I wanted to
> use this. Any way to make it continue where it was running after the
> exception is handled?
>
>
> def confirm_exit():
> while True:
> q = raw_input("This will quit the program, are you sure? [y/N]")
> if q in ('y', 'Y'):
> sys.exit(0)
> elif q in ('n', 'N'):
> print("Continuing execution")
> # just go back to normal execution, is it possible??
> break
>
>
> def _exception_handler(etype, value, tb):
> if etype == KeyboardInterrupt:
> confirm_exit()
> else:
> sys.exit(1)
>
>
> def set_exception_handler():
> sys.excepthook = _exception_handler
I think the trick is to not use an except hook, but trap the
interrupt on a lower level.
This seems to work; I'm not sure how robust it is:
import signal
def handler(signum, frame):
while True:
q = raw_input("This will quit the program, are you sure? [y/N]")
if q[:1] in "yY":
raise KeyboardInterrupt
elif q[:1] in "nN":
print("Continuing execution")
# just go back to normal execution
return
signal.signal(signal.SIGINT, handler)
If you're debugging this on a Unix platform, it may help to know
that you can also kill a process with control-\
Hope this helps,
-- HansM
More information about the Python-list
mailing list