Глобальная обработка исключений Python - PullRequest
41 голосов
/ 06 июля 2011

Итак, я хочу поймать KeyboardInterrupt в глобальном масштабе и хорошо с этим справиться. Я не хочу заключать весь мой сценарий в огромное предложение try / исключением, потому что это звучит просто грубо. Есть ли способ сделать это?

Ответы [ 5 ]

106 голосов
/ 06 июля 2011

Вы можете изменить sys.excepthook, если вы действительно не хотите использовать 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
24 голосов
/ 06 июля 2011

Если это скрипт для выполнения в командной строке, вы можете инкапсулировать свою логику времени выполнения в main(), вызвать ее в if __name__ == '__main__' и обернуть ее.

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)
11 голосов
/ 06 июля 2011

Вы также можете использовать сигнал , например:

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)

Выход:

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

N.B: не смешивайте использование сигнала с потоками.

8 голосов
/ 06 июля 2011

Есть ли в вашем скрипте функция, которую вы вызываете для его запуска?

main()

тогда просто сделайте:

try:
    main()
except:
    ...

Если у вас нет main, а просто огромный скрипт, который запускается построчно, то вы должны поместить его в main.

4 голосов
/ 06 июля 2011

Нет другого способа сделать это, кроме как заключить весь скрипт в функцию main() и окружить его блоком try..except - что в значительной степени совпадает:

def main():
    # Your script goes here
    pass

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # cleanup code here
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...