Как лучше всего использовать else-блок при по обработке исключений?

248 просмотра
0
0 Комментариев

При написании кода по обработке помимо необязательного finally блока есть еще и необязательный else блок. Напомню, что этот блок кода выполняется если try блок завершился успешно, без летящих исключений.

Вопрос: Зачем нужен else блок, если все можно поместить в try блок?

Об этом вопросе уже было обсуждение в англоязычной версии SO: Python try-else. Но опять же, на мой взгляд, нет ясного и конкретного ответа, когда без else блока действительно нельзя обойтись и лучше с ним.

Пока мое понимание на уровне правила(сформулировал сам, независимо от кого-либо): Если понадобился else блок, то код функции сложноват. Код в else следует поместить в отдельный метод и вызывать не в том куске кода, где хочется написать else, а уровнем по выше, т.е. более высокоуровневой функции.


Добавить комментарий

1 Ответы

Python Опубликовано 12.12.2018
0

Давайте сравнивать два варианта:

  1. Выполнение каких-то действий в самом конце try;
  2. Выполнение этих же действий в отдельном блоке else.

Допустим, это добавление записи в лог.

В первом случае, во время логирования может возникнуть исключение, которое будет поймано блоком except. Но что, если вы не хотите обрабатывать исключения логирования в этом месте? Тогда на помощь приходит блок else:

try:
    # код, который может бросить исключение IOError
except IOError:
    # обработка исключения
else:
    # логирование успеха операции из try
    # здесь также может возникнуть IOError, но он не поймается в except
finally:
    # код, который выполнится в любом случае

Можно также считать else противоположностью except — частью языка, введённой для полноты возможностей. try и finally выполняются всегда. except — только при возникновении исключений. else — только когда нет исключений. Получается полное множество.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up