2014-06-15 13 views
8

Tuyên bố từ chối: điều này có vẻ trùng lặp, nhưng việc tìm câu trả lời cho vấn đề cụ thể này là không đáng kể - tôi hy vọng những người khác sẽ tìm thấy câu hỏi/câu trả lời này dễ dàng hơn!Python: không thể bắt được IndexError

Khi tôi chạy đoạn mã sau, nó không thành công để bắt IndexError thứ hai, nâng nó thay vì:

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

kết quả trong

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

Trả lời

14

Vấn đề là sử dụng xấu của except ... cú pháp. Điểm mấu:

except ValueError,IndexError: 

nên

except (ValueError,IndexError): 

Giải thích: Nếu bạn muốn kiểm tra việc exception vậy, cú pháp là except <exception-class>,e nơi biến e được gán một thể hiện của <exception-class>. Dưới đây là những gì xảy ra trong các mã thất bại:

  1. open("afile",'x') ném một ValueError như 'x' không phải là một chuỗi chế độ hồ sơ hợp lệ.
  2. except ValueError,IndexError gán trường hợp ném ValueError vào biến mới được gọi là IndexError.
  3. Biến mới này ghi đè lớp dựng sẵn IndexError.
  4. l[4] tăng ngoại lệ IndexError thực tế.
  5. Điều khoản except được chọn cho loại ngoại lệ này, nhưng chỉ có một trường hợp ValueError (có tên là IndexError) được tìm thấy, vì vậy ngoại lệ không bị bắt.

Nếu bạn đang chạy phiên python tương tác, bạn có thể del IndexError để tìm ra nội trang và cho phép bạn bắt giữ lại IndexError.

+1

Điều này được sửa trong Python 3 trong đó cú pháp cho câu lệnh 'except' đã được thay đổi từ' ngoại trừ X, T' thành 'ngoại trừ X thành T'. – martineau

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