2014-06-15 3 views
8

Disclaimer: questo sembra un duplicato, ma trovare una risposta a questo particolare problema è stato più che banale - spero che altri troveranno questa domanda/risposta con più facilità!Python: impossibile rilevare un Errore Index

Quando eseguo il seguente codice, non riesce a prendere il secondo IndexError, alzando invece:

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

risultati in

--------------------------------------------------------------------------- 
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 

risposta

14

Il problema era cattivo uso della except ... sintassi. La linea:

except ValueError,IndexError: 

dovrebbe essere

except (ValueError,IndexError): 

Spiegazione: Se si vuole esaminare l'eccezione che è stato gettato, la sintassi è except <exception-class>,e dove variabile e viene assegnato un caso di <exception-class>. Ecco cosa succede nel codice non riuscendo:

  1. open("afile",'x') getta un ValueError come 'x' non è una stringa modalità file valido.
  2. except ValueError,IndexError assegna l'istanza generata ValueError a una nuova variabile denominata IndexError.
  3. Questa nuova variabile sovrascrive la classe integrata IndexError.
  4. l[4] genera un'eccezione IndexError effettiva.
  5. La clausola except viene controllata per questo tipo di eccezione, ma viene rilevata solo un'istanza di ValueError (che capita di avere il nome IndexError), quindi l'eccezione non viene rilevata.

Se si esegue una sessione interattiva di Python, è possibile del IndexError per scoprire la incorporato e consentono di prendere di nuovo IndexError s'.

+1

Questo è corretto in Python 3 dove la sintassi per le istruzioni 'except' è stata cambiata da' tranne X, T' a 'tranne X come T'. – martineau