Python: не удается поймать ошибку IndexError

#python #python-2.7 #exception-handling

#python #python-2.7 #исключение

Вопрос:

Отказ от ответственности: это похоже на дубликат, но поиск ответа на эту конкретную проблему был более чем тривиальным — я надеюсь, что другие найдут этот вопрос / ответ с большей легкостью!

Когда я запускаю следующий код, он не может поймать вторую ошибку 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:

Проблема заключалась в неправильном использовании except ... синтаксиса. Строка:

 except ValueError,IndexError:
  

должно быть

 except (ValueError,IndexError):
  

Объяснение: Если вы хотите проверить созданное исключение, синтаксис таков except <exception-class>,e , что переменной e присваивается экземпляр <exception-class> . Вот что происходит в сбойном коде:

  1. open("afile",'x') выдает ValueError значение as '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 операторов был изменен с except X, T на except X as T .