2014-06-15 68 views
8

聲明:這看起來像是重複的,但找到這個特定問題的答案不僅僅是微不足道 - 我希望其他人能夠更輕鬆地找到這個問題/答案!Python:無法捕捉IndexError

當我運行下面的代碼,它未能趕上第二IndexError,提高它來代替:

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

結果

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

回答

14

問題是不好用except ...語法。行:

except ValueError,IndexError: 

應該

except (ValueError,IndexError): 

說明:如果你想檢查拋出的異常,語法是except <exception-class>,e其中可變e被分配<exception-class>一個實例。下面是失敗的代碼會發生什麼:

  1. open("afile",'x')拋出一個ValueError'x'是不是有效的文件模式字符串。
  2. except ValueError,IndexError將拋出的ValueError實例分配給一個名爲IndexError的新變量。
  3. 這個新變量覆蓋了內建的IndexError類。
  4. l[4]引發了一個實際的IndexError異常。
  5. 檢查except子句中是否有此異常類型,但僅找到ValueError(恰好名稱爲IndexError)的實例,因此未捕獲到異常。

如果您正在運行一個交互式的Python會話,你可以del IndexError揭開內置,讓你再次趕上IndexError的。

+1

這在Python 3中得到了修復,其中'except'語句的語法已經從'X除外'改變爲'X除外T'。 – martineau