2010-04-19 2 views
17

В скриптах Python, есть много случаев, когда прерывание клавиатуры (Ctrl-C) не убить процесс из-за голый except статьи где-то в коде:избежать случайного ловли KeyboardInterrupt и SystemExit в Python 2.4

try: 
    foo() 
except: 
    bar() 

стандартное решение в Python 2.5 или выше, чтобы поймать Exception, а не использовать голые except пункты:

try: 
    foo() 
except Exception: 
    bar() 

Это работает, потому что, по состоянию на Python 2.5, KeyboardInterrupt и SystemExit inherit from BaseException, а не Exception. Однако на некоторых установках по-прежнему работает Python 2.4. Как эту проблему можно решить в версиях до Python 2.5?

(я собираюсь ответить на этот вопрос сам, но положить его здесь, так что люди ищут его можно найти решение.)

+0

Не задавайте вопросы, чтобы вы могли сами ответить на них. SO не является wiki случайных данных; это ответы на вопросы, которые люди действительно задают *. –

+3

@Glenn Maynard: Guess _you_ ошибаются: http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Curd

+0

Отвечая на ваш собственный вопрос, если вы ответите на вопрос после запроса это нормально. Задавая вопрос *, чтобы вы могли ответить на него *, совершенно другое. –

ответ

13

Согласно Python documentation, правильный путь, чтобы справиться с этим в версиях Python раньше 2.5 является:

try: 
    foo() 
except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    bar() 

Это очень многословие, но по крайней мере это решение.

+1

Вы, вероятно, должны сделать второй 'except' также' except Exception: ', чтобы избежать обнаружения других исключений, которые не должны быть пойманы. –

Смежные вопросы