Развёрнутое пояснение:
1. Вызов save(10) входит в функцию и сразу попадает в блок try.
2. Внутри try выполняется value / 0, что порождает исключение ZeroDivisionError.
3. Управление переходит в блок except ZeroDivisionError, который готовится вернуть строку "fail".
4. Перед тем как функция завершится, Python обязательно выполняет блок finally, независимо от того, было ли исключение.
5. В finally встречается собственный return "cleanup"; return в finally заменяет любой ранее подготовленный результат или даже не обработанное исключение.
6. Поэтому save(10) возвращает "cleanup", и print выводит cleanup.
Почему это важно: return в finally перекрывает не только обычные значения, но и исключения, что легко превращает функцию очистки ресурсов в источник молчаливых потерь ошибок. В реальном коде finally стоит использовать только для освобождения ресурсов, закрытия соединений и снятия флагов, а итоговый результат или статус ошибки возвращать из try/except.
Post #4798
401
Python: задачки и вопросы
- ✍ 2