2014-05-24 19 views
8

IndexError istisnasına neden olan dizini almak mümkün mü?Bir IndexError istisnasına neden olan dizini alın

örnek kod: el erişilen endeksi takip hariç

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

Listenin uzunluğunu el ile kontrol edebilirsiniz, çünkü bu noktada ilk IndexError neden olur. – sagarchalise

+1

@sagarchalise, true, ama [izin almaktan af dilemek daha kolay] (https://docs.python.org/2/glossary.html#term-eafp)! – jonrsharpe

cevap

5

Yalnızca el ile; örneğin:

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

Sanırım bu en basit – PKaura

+0

Bu bir listenin önceden belirlenmiş 20 endeksine eriştiğinizde işe yaramayacak olsa da, bu durumda index'e erişmeden önce try_index'i güncellemeniz gerekir. Baskı arrında olduğu gibi [0]; baskı arr [21]; print arr [15] etc – PKaura

+0

Bu durumda her zaman istisnayı işleyen bir işlev yazabilirsiniz, böylece 'my_print (arr, 0); my_print (arr, 21); my_print (arr, 15); ' –

4

KeyError aksine IndexError (henüz) bu bilgi sağlamaz çünkü doğrudan bir yolu var. İstediğiniz argümanlarla IndexError yükseltmek list yerleşik alt sınıf:

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

Aslında, hatta normale list geri dönüştürmek için gerek yoktur.

İlgili konular