2014-05-24 17 views
8

Có thể lấy chỉ mục gây ra một ngoại lệ IndexError không?Lấy chỉ mục đã gây ra ngoại lệ IndexError

Mẫu mã:

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

Bạn có thể kiểm tra theo cách thủ công theo chiều dài của danh sách vì chỉ số IndexError đầu tiên sẽ được gây ra tại thời điểm đó. – sagarchalise

+1

@sagarchalise, đúng, nhưng nó [dễ dàng hơn để yêu cầu sự tha thứ hơn sự cho phép] (https://docs.python.org/2/glossary.html#term-eafp)! – jonrsharpe

Trả lời

5

Chỉ theo cách thủ công; ví dụ:

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

Tôi đoán đây là đơn giản nhất – PKaura

+0

Mặc dù điều này sẽ không hữu ích khi bạn truy cập 20 chỉ mục được quyết định trước của danh sách, trong trường hợp này bạn cần phải cập nhật try_index mỗi lần trước khi bạn truy cập vào chỉ mục. Như trong in arr [0]; in arr [21]; print arr [15] etc – PKaura

+0

Trong trường hợp đó bạn luôn có thể viết một hàm xử lý ngoại lệ, để bạn có thể đơn giản làm 'my_print (arr, 0); my_print (arr, 21); my_print (arr, 15); ' –

4

Trừ bằng tay theo dõi các chỉ số bạn truy cập, tôi không tin như vậy, ít nhất là không trong 2.7. Trừ khi tôi đang đọc sai đề xuất, there is a proposal for this in 3.5.

4

Không có cách nào trực tiếp, vì không giống như KeyError, IndexError không cung cấp thông tin này (chưa). Bạn có thể phân lớp được xây dựng trong list nâng IndexError với đối số bạn muốn:

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

Trên thực tế, bạn thậm chí không cần phải chuyển đổi nó trở lại bình thường list.

Các vấn đề liên quan