Короткий ответ
В блок try помещают код, который может выбросить исключение, а except перехватывает ошибки. Блок else срабатывает, только когда исключения не было, а finally выполняется всегда — независимо от того, произошла ошибка или нет.
Как это работает подробнее
Конструкция управляет ошибками времени выполнения, не давая программе прерваться в произвольном месте.
- Несколько except. Для разных типов ошибок пишут отдельные блоки или один блок с кортежем типов исключений.
- Блок else. Выполняется только при успешном завершении
try, без единого исключения. - Блок finally. Предназначен для очистки и работает всегда: закрытие файлов, освобождение ресурсов.
- Порядок блоков. Фиксирован: сначала
try, затем один или несколькоexcept, потомelseиfinally. - Неперехваченная ошибка. Исключение передаётся наружу во внешние обработчики, а без них интерпретатор завершает программу и печатает информацию об ошибке.
Пример кода
Полная конструкция обработки исключений
try:
res = 100 / 0
except ZeroDivisionError:
print('Делить на ноль нельзя!')
except ValueError:
print('Некорректное значение!')
else:
print('Результат:', res)
finally:
print('Блок finally выполняется всегда.')Что использовать на практике
- Только опасный код. В
tryпомещай лишь операции, которые реально могут бросить исключение. - Очистка. Закрытие файлов и освобождение ресурсов выполняй в
finally. - Успешная ветка. Логику «если ошибки не было» клади в
else, а не после блокаtry.
Подводные камни
- Широкий перехват. Голый
exceptловит всё, включая системные исключения, и прячет баги. - Порядок обработчиков. Общий обработчик раньше конкретного перехватит ошибку, и остальные блоки не сработают.
- Возврат в finally.
returnвнутриfinallyперекроет результатtryилиexcept.
Как отвечать на собеседовании
- Опиши структуру из try, except, else и finally и роли каждого блока → объясни, когда выполняется else, а когда finally → приведи пример с делением на ноль → добавь, что finally нужен для гарантированной очистки ресурсов.