2014-06-15 11 views
8

Zrzeczenie się: to wygląda na duplikat, ale znalezienie odpowiedzi na ten konkretny problem było więcej niż banalne - mam nadzieję, że inni znajdą to pytanie/odpowiedź z większą łatwością!Python: nie można złapać IndexError

Kiedy uruchomić poniższy kod, to nie złapać drugi IndexError, podnosząc go zamiast:

try: 
    raise ValueError 
except ValueError,IndexError: 
    pass 
l = [1,2,3] 
try: 
    l[4] 
except IndexError: 
    print "an index error!" 

skutkuje

--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-24-61bcf6d2b9af> in <module>() 
     6  pass 
     7 try: 
----> 8  l[4] 
     9 except IndexError: 
    10  print "an index error!" 

IndexError: list index out of range 

Odpowiedz

14

Problemem było złe wykorzystanie except ... składni. Linia:

except ValueError,IndexError: 

powinny być

except (ValueError,IndexError): 

Wyjaśnienie: Jeśli chcesz sprawdzić wyjątek, który został rzucony, składnia jest except <exception-class>,e gdzie zmienna e przypisany jest wystąpienie <exception-class>. Oto co się dzieje w kodzie upadającego:

  1. open("afile",'x') rzuca ValueError jak 'x' nie jest prawidłowy ciąg tryb plików.
  2. except ValueError,IndexError Przypisuje wyrzuconą instancję ValueError do nowej zmiennej o nazwie IndexError.
  3. Ta nowa zmienna zastępuje wbudowaną klasę IndexError.
  4. l[4] podnosi rzeczywisty wyjątek IndexError.
  5. Klauzula except jest sprawdzana dla tego typu wyjątku, ale znaleziono tylko instancję ValueError (która ma nazwę), więc wyjątek nie zostanie przechwycony.

Jeśli prowadzisz sesję interaktywną Pythona można del IndexError odkryć wbudowane i pozwala złapać IndexError „s ponownie.

+1

Naprawiono to w Pythonie 3, gdzie składnia instrukcji 'except' została zmieniona z' except X, T' na 'except X as T'. – martineau

Powiązane problemy