2010-04-19 14 views
17

W skryptów Pythona, istnieje wiele przypadków, w których przerwanie klawiatury (Ctrl-C) nie zabić proces, bo z nagim except klauzuli gdzieś w kodzie:Unikanie przypadkowego połowu KeyboardInterrupt i SystemExit w Pythonie 2.4

try: 
    foo() 
except: 
    bar() 

roztwór standardowy Pythona 2,5 lub wyższej, aby złapać Exception zamiast przy użyciu nagich except punktach:

try: 
    foo() 
except Exception: 
    bar() 

pracuje z tym, jak Pythona 2.5, KeyboardInterrupt i SystemExit dziedziczy po BaseException, a nie Exception. Jednak niektóre instalacje nadal działają w języku Python 2.4. W jaki sposób można rozwiązać ten problem w wersjach wcześniejszych niż Python 2.5?

(Idę sobie odpowiedzieć na to pytanie, ale wprowadzenie go tutaj, więc ludzie szukają może znaleźć rozwiązanie.)

+0

Nie zadawaj pytań, aby samodzielnie na nie odpowiedzieć. SO nie jest wiki przypadkowych danych; to odpowiedzi na pytania, które ludzie faktycznie proszą *. –

+3

@Glenn Maynard: Domyślam się, że jesteś w błędzie: http://meta.stackexchange.com/questions/12513/przejdź-nierozpocznij-poprośnij-pytania – Curd

+0

Odpowiadając na własne pytanie, jeśli wymyślisz odpowiedź po zapytaniu w porządku. Zadając pytanie * tak, abyś mógł na nie odpowiedzieć * jest zupełnie inny. –

Odpowiedz

13

Według Python documentation prawo sposób obsłużyć to w wersjach Pythona wcześniej niż 2.5 to:

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

To bardzo rozwlekłe, ale przynajmniej jest rozwiązaniem.

+1

Powinieneś prawdopodobnie uczynić drugie 'z wyjątkiem' również 'z wyjątkiem wyjątku:', aby uniknąć przechwycenia innych wyjątków, które nie powinny zostać przechwycone. –