Что такое блок else в конструкции try-except и когда он отрабатывает в Python
Что проверяют
Знаете ли вы редкую конструкцию и понимаете ли, зачем она нужна.
Как отвечать
Блок выполняется, если исключения не возникло. Порядок такой: тело, затем этот блок при отсутствии ошибки, затем завершающий блок в любом случае.
try:
response = api.fetch(url)
except RequestError as e:
log.warning("не удалось получить данные: %s", e)
else:
save(response) # только если исключения не было
finally:
session.close() # всегдаЗачем он нужен, если код можно просто дописать в конец тела: чтобы сузить область наблюдения. Если положить сохранение внутрь основного блока, то исключение из сохранения тоже попадёт в обработчик, хотя тот писался для ошибок получения данных. Ошибка будет перехвачена не тем обработчиком, залогирована с неверным смыслом и, возможно, молча проглочена.
То есть правило простое: в основном блоке остаётся только то, что вы действительно готовы перехватывать, а всё остальное переезжает в отдельный блок. Это делает намерение явным для читателя.
Полезно упомянуть, что такой же блок есть и у циклов, где он работает по другому правилу: выполняется, если цикл завершился без прерывания. Типичное применение это поиск, где нужно выполнить действие в случае, когда ничего не найдено:
for item in items:
if item.matches(query):
handle(item)
break
else:
log.info("ничего не найдено")Эта конструкция читается неочевидно, и многие считают выбор слова неудачным, поэтому в командном коде её иногда избегают. Но знать про неё нужно: встретив её в чужом коде, легко ошибиться в прочтении.
Где спотыкаются
Не знают о существовании блока вовсе.
Кладут в основной блок лишний код и ловят чужие исключения.
Путают правило срабатывания у цикла с правилом у обработки исключений.
Считают, что блок выполняется до завершающего в любом случае.