← Назад к вопросам

Когда вызывается else при обработке try finaly в Python?

1.2 Junior🔥 151 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Блок else при try-finally в Python

Блок else выполняется только если в блоке try не было исключений и не выполнялся return, break или continue. Это работает как с try-except, так и с try-finally.

Синтаксис

try:
    # Код, который может выбросить исключение
    pass
except SomeException:
    # Обработка исключения
    pass
else:
    # Выполнится ТОЛЬКО если в try не было исключений
    pass
finally:
    # ВСЕГДА выполнится в конце
    pass

Порядок выполнения блоков

print("1. try")
try:
    print("2. Внутри try")
    # Нет исключения
else:
    print("3. else - выполнился, т.к. нет исключения")
finally:
    print("4. finally - всегда выполняется")

# Вывод:
# 1. try
# 2. Внутри try
# 3. else - выполнился, т.к. нет исключения
# 4. finally - всегда выполняется

Когда else НЕ выполняется

1. Если произошло исключение

try:
    x = 1 / 0  # ZeroDivisionError
except ZeroDivisionError:
    print("Поймано исключение")
else:
    print("else не выполнится")  # Не будет
finally:
    print("finally выполнится")  # Будет

2. Если в try есть return

def test_return():
    try:
        print("try")
        return "from try"
    else:
        print("else не выполнится")  # Не будет
    finally:
        print("finally выполнится")  # Будет

print(test_return())  # Вывод: try, finally выполнится, from try

3. Если в try есть break или continue

for i in range(3):
    try:
        if i == 1:
            continue
        print(f"try: {i}")
    else:
        print(f"else: {i}")  # Не выполнится когда continue
    finally:
        print(f"finally: {i}")  # Выполнится всегда

# Вывод:
# try: 0
# else: 0
# finally: 0
# finally: 1  <- только finally при continue
# try: 2
# else: 2
# finally: 2

Практические примеры

Пример 1: Безопасный поиск в словаре

def safe_dict_lookup(d, key):
    try:
        value = d[key]
    except KeyError:
        print(f"Ключ {key} не найден")
    else:
        print(f"Ключ {key} найден с значением {value}")
    finally:
        print("Поиск завершен")

my_dict = {"name": "John", "age": 30}

safe_dict_lookup(my_dict, "name")
# Вывод:
# Ключ name найден с значением John
# Поиск завершен

safe_dict_lookup(my_dict, "email")
# Вывод:
# Ключ email не найден
# Поиск завершен

Пример 2: Открытие файла с else

def process_file(filename):
    try:
        f = open(filename)
    except FileNotFoundError:
        print("Файл не найден")
    else:
        try:
            content = f.read()
            print(f"Прочитано {len(content)} символов")
        finally:
            f.close()
            print("Файл закрыт")

process_file("data.txt")  # Если существует
process_file("missing.txt")  # Если не существует

Пример 3: Парсинг JSON

import json

def parse_json(json_string):
    try:
        data = json.loads(json_string)
    except json.JSONDecodeError as e:
        print(f"Ошибка парсинга: {e}")
    else:
        print(f"JSON успешно распарсен: {data}")
    finally:
        print("Парсинг завершен")

parse_json('{"name": "John"}')
# Вывод:
# JSON успешно распарсен: {'name': 'John'}
# Парсинг завершен

parse_json('{invalid json}')
# Вывод:
# Ошибка парсинга: Expecting property name enclosed in double quotes
# Парсинг завершен

Зачем нужен else?

Без else пришлось бы писать:

# ❌ Плохо - флаг нужен
success = False
try:
    result = do_something()
    success = True
except Exception:
    print("Ошибка")

if success:
    print(f"Успешно: {result}")

# ✅ Хорошо - используем else
try:
    result = do_something()
except Exception:
    print("Ошибка")
else:
    print(f"Успешно: {result}")

Полный порядок выполнения

def full_example():
    try:
        print("1. try блок")
        # код
    except ValueError:
        print("2. except блок")
    else:
        print("3. else блок - только если нет исключений")
    finally:
        print("4. finally блок - ВСЕГДА последним")

full_example()
# Вывод: 1, 3, 4 (если нет исключения)
# или: 1, 2, 4 (если есть ValueError)

Итог: else выполняется только если в try нет исключений и нет return/break/continue. Это удобно для кода, который должен выполниться только при успешном прохождении try-блока.

Когда вызывается else при обработке try finaly в Python? | PrepBro