2010-04-19 7 views
17

In script Python, ci sono molti casi in cui un interrupt di tastiera (Ctrl-C) non riesce a uccidere il processo a causa di un except clausola di nuda da qualche parte nel codice:evitare la cattura accidentale KeyboardInterrupt e SystemExit in Python 2.4

try: 
    foo() 
except: 
    bar() 

La soluzione standard in Python 2.5 o superiore è quello di catturare Exception invece di usare nude except clausole:

try: 
    foo() 
except Exception: 
    bar() 

Questo funziona perché, a partire da Python 2.5, KeyboardInterrupt e SystemExit eredita da BaseException, non Exception. Tuttavia, alcune installazioni eseguono ancora Python 2.4. Come può essere gestito questo problema nelle versioni precedenti a Python 2.5?

(ho intenzione di rispondere a questa domanda me stesso, ma metterlo qui così la gente alla ricerca di che riesce a trovare una soluzione.)

+0

Non fare domande solo così puoi rispondere da solo. SO non è un wiki di dati casuali; sono le risposte alle domande che le persone * stanno effettivamente chiedendo *. –

+3

@Glenn Maynard: indovina _you_ hai torto: http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Curd

+0

Rispondere alla tua stessa domanda se trovi la risposta dopo aver chiesto va bene. Fare una domanda * solo così puoi rispondere * è completamente diverso. –

risposta

13

Secondo il Python documentation, il modo giusto per gestire questo nelle versioni precedenti a Python 2.5 è:

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

Questo è molto verboso, ma almeno è una soluzione.

+1

Probabilmente dovresti fare il secondo 'except' anche' except Exception: ', per evitare di catturare altre eccezioni che non dovrebbero essere catturate. –

Problemi correlati