Python:无法捕获IndexError

时间:2014-06-15 13:58:40

标签: python python-2.7 exception-handling

免责声明:这看起来像是重复的,但找到这个特定问题的答案并非易事 - 我希望其他人能够更轻松地找到这个问题/答案!

当我运行以下代码时,它无法捕获第二个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

1 个答案:

答案 0 :(得分:19)

问题是使用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),因此不会捕获异常。
  6. 如果您正在运行交互式python会话,则可以del IndexError发现内置内容并允许您再次捕获IndexError