Я знаю, что я могу сделать:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Я также могу сделать это:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreTooShortException:
# stand on a ladder
Но если я хочу сделать то же самое в двух разных исключениях, лучшее, что я могу придумать сейчас, это сделать следующее:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreBeingMeanException:
# say please
Есть ли способ, которым я могу сделать что-то вроде этого (поскольку действие в обоих исключениях заключается в say please
:)
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
Теперь это действительно не будет работать, так как он соответствует синтаксису для:
try:
# do something that may fail
except Exception, e:
# say please
Таким образом, мои попытки поймать два разных исключения не оправдались.
Есть ли способ сделать это?
python
exception
exception-handling
inspectorG4dget
источник
источник
Ответы:
Из документации Python :
Или только для Python 2:
Отделение исключения от переменной запятой будет по-прежнему работать в Python 2.6 и 2.7, но теперь устарело и не работает в Python 3; Теперь вы должны использовать
as
.источник
list
, и это привело кTypeError
. Похоже, что ошибки должны быть вtuple
ловле, чтобы работать, как ожидалось.except
строке. Он обязательно должен быть заключен в скобки, если он создан вexcept
строке.2 + (x * 2)
,(x * 2)
конечно, не кортеж. Скобки - это общая группирующая конструкция. Определяющей характеристикой кортежа является то, что он содержит запятую - см. Документацию Python : «Обратите внимание, что на самом деле кортеж - это запятая , а не скобки».Сделай это:
Скобки требуются из-за более старого синтаксиса, который использовал запятые, чтобы назначить объект ошибки имени.
as
Ключевое слово используется для задания. Вы можете использовать любое имя для объекта ошибки, я предпочитаюerror
лично.Лучшая практика
Чтобы сделать это способом, совместимым в настоящее время и в будущем с Python, вам необходимо отделить Исключения запятыми и заключить их в скобки, чтобы отличать их от более раннего синтаксиса, который назначал экземпляр исключения имени переменной, следуя типу Исключения, который должен быть пойман с помощью запятая.
Вот пример простого использования:
Я указываю только эти исключения, чтобы избежать скрытия ошибок, от которых я ожидаю полной трассировки стека.
Это задокументировано здесь: https://docs.python.org/tutorial/errors.html
Вы можете назначить исключение переменной (
e
обычно, но вы можете предпочесть более подробную переменную, если у вас длинная обработка исключений или ваша IDE выделяет только те выделения, которые больше, чем у меня.) Экземпляр имеет атрибут args. Вот пример:Обратите внимание, что в Python 3
err
объект выпадает из области видимости после завершенияexcept
блока.Устаревшее
Вы можете увидеть код, который присваивает ошибку с запятой. Это использование, единственная форма, доступная в Python 2.5 и более ранних версиях, устарело, и если вы хотите, чтобы ваш код был напрямую совместим с Python 3, вы должны обновить синтаксис для использования новой формы:
Если вы видите назначение запятой в своей кодовой базе и используете Python 2.5 или выше, переключитесь на новый способ, чтобы ваш код оставался совместимым при обновлении.
suppress
Менеджер контекстаПринятый ответ - минимум 4 строки кода:
try
,except
,pass
Линии могут быть обработаны в одной строке с менеджером контекста подавить, доступную в Python 3.4 :Поэтому, когда вы хотите использовать
pass
определенные исключения, используйтеsuppress
.источник
suppress
, много более читаемым , чем просто делатьpass
наexcept
Из документации Python -> 8.3 Обработка исключений :
источник
Если вы часто используете большое количество исключений, вы можете заранее определить кортеж, чтобы вам не приходилось вводить их много раз.
НОТЫ:
Если вам также необходимо перехватить другие исключения, кроме тех, которые находятся в предопределенном кортеже, вам нужно определить другое, кроме блока.
Если вы просто не можете терпеть глобальную переменную, определите ее в main () и передайте, где это необходимо ...
источник
Один из способов сделать это ..
а другой способ - создать метод, который выполняет задачу, выполняемую
except
блоком, и вызвать ее через весьexcept
блок, который вы пишете.Я знаю, что второй не лучший способ сделать это, но я просто показываю несколько способов сделать это.
источник
except
предложений - это нормально, если вы хотите обрабатывать исключения по-разному.