39

Как поймать несколько исключений в одной строке? (в блоке "except")

11

Я столкнулся с проблемой обработки нескольких исключений в Python. У меня есть код, который выглядит следующим образом:

try:
    # выполняем некоторые действия, которые могут завершиться неудачей
except:
    # делаем это, если что-то пошло не так

Я также могу сделать так:

try:
    # выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException:
    # скажем пожалуйста
except YouAreTooShortException:
    # встанем на лестницу

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

try:
    # выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException:
    # скажем пожалуйста
except YouAreBeingMeanException:
    # скажем пожалуйста

Хотелось бы сделать что-то вроде этого (так как действие в обоих исключениях - это сказать пожалуйста):

try:
    # выполняем некоторые действия, которые могут завершиться неудачей
except IDontLikeYouException, YouAreBeingMeanException:
    # скажем пожалуйста

Однако это не сработает, потому что соответствует синтаксису для:

try:
    # выполняем некоторые действия, которые могут завершиться неудачей
except Exception, e:
    # скажем пожалуйста

Таким образом, моя попытка поймать два разных исключения не совсем удалась. Есть ли способ сделать это?

2 ответ(ов)

0

Если вы часто используете большое количество исключений, вы можете заранее определить кортеж с ними, чтобы не вводить их повторно.

# Этот пример кода — это техника, которую я использую в библиотеке для подключения к веб-сайтам и сбора данных

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  # Выполняем обычные действия, если исключение не возникло

ПРИМЕЧАНИЯ:

  1. Если вам также нужно перехватить другие исключения, кроме тех, что в предопределенном кортеже, вам нужно будет определить еще один блок except.
  2. Если вы не можете терпеть глобальную переменную, определите ее в функции main() и передавайте там, где это нужно.
0

Один из способов сделать это таков:

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]

Я понимаю, что второй способ не является наилучшим, но я просто показываю несколько вариантов решения этой задачи.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь