Как перехватить несколько исключений в одной строке (кроме блока)
Сделай это:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
Скобки требуются из-за более старого синтаксиса, который использовал запятые, чтобы назначить объект ошибки имени. as
Ключевое слово используется для задания. Вы можете использовать любое имя для объекта ошибки, я предпочитаю error
лично.
Лучшая практика
Чтобы сделать это способом, совместимым в настоящее время и в будущем с Python, вам необходимо отделить Исключения запятыми и заключить их в скобки, чтобы отличать их от более раннего синтаксиса, который назначал экземпляр исключения имени переменной, следуя типу Исключения, который должен быть пойман с помощью запятая.
Вот пример простого использования:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
Я указываю только эти исключения, чтобы избежать скрытия ошибок, от которых я ожидаю полной трассировки стека.
Это задокументировано здесь: https://docs.python.org/tutorial/errors.html
Вы можете назначить исключение переменной ( e
обычно, но вы можете предпочесть более подробную переменную, если у вас длинная обработка исключений или ваша IDE выделяет только те выделения, которые больше, чем у меня.) Экземпляр имеет атрибут args. Вот пример:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Обратите внимание, что в Python 3 err
объект выпадает из области видимости после завершения except
блока.
Устаревшее
Вы можете увидеть код, который присваивает ошибку с запятой. Это использование, единственная форма, доступная в Python 2.5 и более ранних версиях, устарело, и если вы хотите, чтобы ваш код был напрямую совместим с Python 3, вы должны обновить синтаксис для использования новой формы:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
Если вы видите назначение запятой в своей кодовой базе и используете Python 2.5 или выше, переключитесь на новый способ, чтобы ваш код оставался совместимым при обновлении.
suppress
Менеджер контекста
Принятый ответ - минимум 4 строки кода:
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
try
, except
, pass
Линии могут быть обработаны в одной строке с менеджером контекста подавить, доступную в Python 3.4 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
Поэтому, когда вы хотите использовать pass
определенные исключения, используйте suppress
.