#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>
. Вот что происходит в сбойном коде:
open("afile",'x')
выдаетValueError
значение as'x'
, которое не является допустимой строкой режима файла.except ValueError,IndexError
присваивает брошенныйValueError
экземпляр новой вызываемой переменнойIndexError
.- Эта новая переменная переопределяет встроенный
IndexError
класс. l[4]
вызывает фактическоеIndexError
исключение.except
Предложение проверяется для этого типа исключения, но найден только экземплярValueError
(у которого есть имяIndexError
), поэтому исключение не перехватывается.
Если вы запускаете интерактивный сеанс python, вы можете del IndexError
раскрыть встроенный и разрешить вам снова перехватывать IndexError
.
Комментарии:
1. Это исправлено в Python 3, где синтаксис для
except
операторов был изменен сexcept X, T
наexcept X as T
.