Оба вызова напечатают «Финал»: return внутри finally заменяет возврат из try/else или except. Такая конструкция также может скрыть необработанное исключение.
Try, else, except и finally: подмена возвращаемого значения
Оба вызова напечатают «Финал»: return внутри finally заменяет возврат из try/else или except. Такая конструкция также может скрыть необработанное исключение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def test_blocks(a, b): try: result = a / b except ZeroDivisionError: return "Ошибка деления на ноль" else: return f"Результат: {result}" finally: return "Финал"
print(test_blocks(10, 2)) print(test_blocks(10, 0))
Ответ
Оба вызова напечатают «Финал»: return внутри finally заменяет возврат из try/else или except. Такая конструкция также может скрыть необработанное исключение.
Результат:
Финал
Финал
При делении 10 на 2 выполняется else, но перед выходом управление переходит в finally. Его return становится итоговым. При делении на ноль сначала выбирается возврат из except, который затем тоже заменяется. Если нужен диагностический вывод при сохранении результата, в finally можно вызвать print("Финал"), не делая возврат. Обычно этот блок используют для освобождения ресурсов.