Python global exception handling

Solution 1:

You could change sys.excepthook if you really don't want to use a try/except.

import sys
def my_except_hook(exctype, value, traceback):
    if exctype == KeyboardInterrupt:
        print "Handler code goes here"
    else:
        sys.__excepthook__(exctype, value, traceback)
sys.excepthook = my_except_hook

Solution 2:

If this is a script for execution on the command line, you can encapsulate your run-time logic in main(), call it in an if __name__ == '__main__' and wrap that.

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)

Solution 3:

You can also use signal like this:

import signal, time

def handler(signum, frame):
    print 'I just clicked on CTRL-C '

signal.signal(signal.SIGINT, handler)

print "waiting for 10 s"
time.sleep(10)

Output:

waiting for 10 s
^CI just clicked on CTRL-C

N.B: Don't mix the use of signal with threads.

Solution 4:

Does your script have a function you call to start it?

main()

then just do:

try:
    main()
except:
    ...

If you don't have a main but just a huge script that runs line-by-line, then you should put it in a main.