2014-05-24 37 views
8

È possibile ottenere l'indice che ha causato un'eccezione IndexError?Ottieni l'indice che ha causato un'eccezione IndexError

codice di esempio:

arr = [0, 2, 3, 4, 5, 6, 6] 
try: 
    print arr[10] # This will cause IndexError 
except IndexError as e: 
    print e.args # Can I get which index (in this case 10) caused the exception? 
+0

È possibile verificare manualmente la lunghezza dell'elenco poiché il primo IndexError verrebbe causato in quel punto. – sagarchalise

+1

@sagarchalise, true, ma è [più facile chiedere perdono che autorizzazione] (https://docs.python.org/2/glossary.html#term-eafp)! – jonrsharpe

risposta

5

Solo manualmente; per esempio:

arr = [1,2,3] 
try: 
    try_index = 42 
    print(arr[try_index]) 
except IndexError: 
    print 'Index', try_index, 'caused an IndexError' 
+0

Immagino che questo sia il più semplice – PKaura

+0

Sebbene questo non sia utile quando si accede a 20 indici pre-decisi di un elenco, nel qual caso è necessario aggiornare il try_index ogni volta prima di accedere all'indice. Come nella stampa arr [0]; print arr [21]; print arr [15] etc – PKaura

+0

Bene in questo caso puoi sempre scrivere una funzione che gestisce l'eccezione, in modo che tu possa semplicemente fare 'my_print (arr, 0); my_print (arr, 21); my_print (arr, 15); ' –

4

Fatta eccezione per tenere traccia manualmente dell'indice si accede, non credo così, almeno non in 2.7. A meno che non abbia letto male la proposta, there is a proposal for this in 3.5.

4

Non c'è modo diretto, perché a differenza di KeyError, IndexError non fornisce queste informazioni (ancora). È possibile creare una sottoclasse il built-in list per sollevare IndexError con argomenti che si desidera:

class vist(list): # Verbose list 
    def __getitem__(self, item): 
     try: 
      v = super().__getitem__(item) # Preserve default behavior 
     except IndexError as e: 
      raise IndexError(item, *e.args) # Construct IndexError with arguments 

     return v 

arr = [0, 2, 3, 4, 5, 6, 6] # list 
arr = vist(arr) # vist 

try: 
    arr[10] 
except IndexError as e: 
    print(e.args) # (10, 'list index out of range') 

In realtà, non è nemmeno bisogno di riconvertirlo alla normalità list.

Problemi correlati