2010-04-19 10 views
17

En los scripts de Python, hay muchos casos en que una interrupción de teclado (Ctrl-C) no puede matar el proceso a causa de un desnudo except cláusula en alguna parte del código:Evitar accidentalmente captura KeyboardInterrupt y SystemExit en Python 2.4

try: 
    foo() 
except: 
    bar() 

La solución estándar en Python 2.5 o superior es atrapar Exception en lugar de utilizar desnudos except cláusulas:

try: 
    foo() 
except Exception: 
    bar() 

Esto funciona porque, a partir de Python 2.5, KeyboardInterrupt y SystemExit hereda de BaseException, no Exception. Sin embargo, algunas instalaciones todavía ejecutan Python 2.4. ¿Cómo se puede manejar este problema en versiones anteriores a Python 2.5?

(voy a responder a esta pregunta a mí mismo, pero ponerlo aquí para que la gente en busca de ella se puede encontrar una solución.)

+0

no hacen preguntas sólo para que se les puede contestar sí mismo. SO no es una wiki de datos aleatorios; son las respuestas a las preguntas que las personas * realmente están haciendo *. –

+3

@Glenn Maynard: Guess _you_ están equivocados: http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Curd

+0

responder a su propia pregunta si la figura la respuesta a cabo después de pedir está bien. Hacer una pregunta * para poder responderla * es completamente diferente. –

Respuesta

13

De acuerdo con la Python documentation, la manera correcta de manejar esto en versiones de Python antes de lo 2.5 es:

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

Eso es muy prolijo, pero al menos es una solución.

+1

Probablemente debas hacer que el segundo 'excepto' también' excepto Exception: ', para evitar capturar otras excepciones que se supone que no deben ser capturadas. –

Cuestiones relacionadas