Итак, я хочу поймать KeyboardInterrupt
по всему миру и справиться с этим красиво. Я не хочу помещать весь мой script в огромный оператор try/except, потому что это просто звучит грубо. Есть ли способ сделать это?
Глобальная обработка исключений Python
Ответ 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