Как поймать несколько исключений в одной строке? (в блоке "except")
Я столкнулся с проблемой обработки нескольких исключений в Python. У меня есть код, который выглядит следующим образом:
try:
# выполняем некоторые действия, которые могут завершиться неудачей
except:
# делаем это, если что-то пошло не так
Я также могу сделать так:
try:
# выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException:
# скажем пожалуйста
except YouAreTooShortException:
# встанем на лестницу
Однако если я хочу выполнить одно и то же действие при возникновении двух разных исключений, единственное решение, которое приходит мне в голову, выглядит следующим образом:
try:
# выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException:
# скажем пожалуйста
except YouAreBeingMeanException:
# скажем пожалуйста
Хотелось бы сделать что-то вроде этого (так как действие в обоих исключениях - это сказать пожалуйста
):
try:
# выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException, YouAreBeingMeanException:
# скажем пожалуйста
Однако это не сработает, потому что соответствует синтаксису для:
try:
# выполняем некоторые действия, которые могут завершиться неудачей
except Exception, e:
# скажем пожалуйста
Таким образом, моя попытка поймать два разных исключения не совсем удалась. Есть ли способ сделать это?
2 ответ(ов)
Если вы часто используете большое количество исключений, вы можете заранее определить кортеж с ними, чтобы не вводить их повторно.
# Этот пример кода — это техника, которую я использую в библиотеке для подключения к веб-сайтам и сбора данных
ConnectErrs = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)
def connect(url, data):
# Выполняем соединение и возвращаем некоторые данные
return(received_data)
def some_function(var_a, var_b, ...):
try:
o = connect(url, data)
except ConnectErrs as e:
# Обработка ошибок
blah # Выполняем обычные действия, если исключение не возникло
ПРИМЕЧАНИЯ:
- Если вам также нужно перехватить другие исключения, кроме тех, что в предопределенном кортеже, вам нужно будет определить еще один блок
except
. - Если вы не можете терпеть глобальную переменную, определите ее в функции
main()
и передавайте там, где это нужно.
Один из способов сделать это таков:
try:
# Здесь выполняете ваши операции
......................
except (Exception1[, Exception2[, ... ExceptionN]]):
# Если возникло какое-либо исключение из данного списка исключений,
# тогда выполняем этот блок
......................
else:
# Если исключений не возникло, выполняем этот блок
Другой способ заключается в создании метода, который выполняет задачу, реализованную в блоке except
, и вызове его в каждом из блоков except
, которые вы пишете:
try:
# Здесь выполняете ваши операции
......................
except Exception1:
functionname(parameterList)
except Exception2:
functionname(parameterList)
except Exception3:
functionname(parameterList)
else:
# Если исключений не возникло, выполняем этот блок
def functionname(parameters):
# ваша задача..
return [expression]
Я понимаю, что второй способ не является наилучшим, но я просто показываю несколько вариантов решения этой задачи.
Вручную вызов (бросание) исключения в Python
Поймать и вывести полный трейсбек исключения в Python без остановки/выхода из программы
Как напечатать исключение в Python?
Как проверить, существует ли переменная?
Как протестировать, что функция Python вызывает исключение?