2014-05-24 5 views
8

Ist es möglich, den Index zu erhalten, der eine Ausnahme IndexError verursachte?Ruft den Index ab, der eine IndexError-Ausnahme verursachte

Beispielcode:

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

Sie können manuell die Länge der Liste überprüfen, da der erste IndexError an diesem Punkt verursacht wird. – sagarchalise

+1

@sagarchalise, stimmt, aber es ist [einfacher, um Vergebung als Erlaubnis zu bitten] (https://docs.python.org/2/glossary.html#term-eafp)! – jonrsharpe

Antwort

5

Nur manuell; zum Beispiel:

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

Ich denke, das ist die einfachste – PKaura

+0

Obwohl dies nicht nützlich sein wird, wenn Sie 20 vordefinierte Indizes einer Liste zugreifen, in diesem Fall müssen Sie den try_index jedes Mal aktualisieren, bevor Sie auf den Index zugreifen. Wie in print arr [0]; Druck arr [21]; print arr [15] usw. – PKaura

+0

In diesem Fall könnten Sie immer eine Funktion schreiben, die die Ausnahme behandelt, so dass Sie einfach 'my_print (arr, 0); mein_druck (arr, 21); my_print (arr, 15); ' –

4

Außer manuell Spur des Index halten Sie zugegriffen, das glaube ich nicht, zumindest nicht in 2.7. Sofern ich den Vorschlag nicht falsch interpretiere, there is a proposal for this in 3.5.

4

Es gibt keinen direkten Weg, denn im Gegensatz zu KeyError, IndexError diese Informationen nicht zur Verfügung stellt (noch) nicht. Sie können die eingebaute in list Unterklasse zu erhöhen IndexError mit Argumenten, die Sie wollen:

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

Eigentlich brauchen Sie nicht einmal konvertieren müssen wieder normal list.

Verwandte Themen