Подтвердить что ты не робот

Глобальная обработка исключений Python

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

4b9b3361

Ответ 1

Вы можете изменить 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

Ответ 2

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

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

Ответ 3

Вы также можете использовать signal следующим образом:

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: Не смешивайте использование сигнала с потоками.

Ответ 4

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

main()

то просто выполните:

try:
    main()
except:
    ...

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

Ответ 5

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

def main():
    # Your script goes here
    pass

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # cleanup code here
        pass