Блок else в try-except: когда выполняется

Блок else в try-except: когда выполняется Обработка исключений

Привет! Мы уже изучили конструкцию try-except и знаем, что она перехватывает ошибки. Но что, если код выполнился без ошибок? Как выполнить код только в этом случае?

Именно для этого существует блок else.

В этой статье мы разберём:

  • Синтаксис try-except-else
  • Когда выполняется else
  • Зачем нужен else
  • Отличие else от finally

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание try-except (статьи 1–3 в этом подменю)

Совет: else делает код чище и логичнее, отделяя «нормальный» код от «аварийного».

Основная часть

Синтаксис try-except-else

try:
    # Код, который может вызвать ошибку
    number = int(input("Введите число: "))
except ValueError:
    # Код, который выполнится при ошибке
    print("Ошибка: нужно ввести число")
else:
    # Код, который выполнится, если ошибки НЕ было
    print(f"Вы ввели: {number}")

Как это работает:

  1. Выполняется код в try
  2. Если ошибка — переходим в except
  3. Если ошибки нет — выполняем else

Простой пример

def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Ошибка: деление на ноль")
    else:
        print(f"Результат: {result}")
        return result

safe_divide(10, 2)   # Результат: 5.0
safe_divide(10, 0)   # Ошибка: деление на ноль

Зачем нужен else

else отделяет код, который должен выполниться только при успехе.

Без else (код в try):

try:
    number = int(input("Введите число: "))
    print(f"Вы ввели: {number}")
except ValueError:
    print("Ошибка: нужно ввести число")

С else:

try:
    number = int(input("Введите число: "))
except ValueError:
    print("Ошибка: нужно ввести число")
else:
    print(f"Вы ввели: {number}")

Совет: else делает код чище, отделяя «нормальную» логику от «аварийной».

else vs finally

БлокКогда выполняется
elseТолько если ошибки НЕ было
finallyВсегда
try:
    number = int(input("Введите число: "))
except ValueError:
    print("Ошибка")
else:
    print("Успешно")
finally:
    print("Это всегда")

Пример с файлом

def read_file(filename):
    try:
        with open(filename, "r") as file:
            data = file.read()
    except FileNotFoundError:
        print("Файл не найден")
        return None
    else:
        print("Файл успешно прочитан")
        return data

content = read_file("data.txt")
print(content)

Пример с несколькими except

try:
    value = int(input("Введите число: "))
    result = 10 / value
except ValueError:
    print("Ошибка: нужно ввести число")
except ZeroDivisionError:
    print("Ошибка: деление на ноль")
else:
    print(f"Результат: {result}")

Когда else не нужен

Если в try нет кода, который должен выполняться только при успехе, else не нужен.

# Плохо
try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка")
else:
    print(result)   # Можно вынести в try

# Хорошо
try:
    result = 10 / 2
    print(result)
except ZeroDivisionError:
    print("Ошибка")

Примеры из реальной жизни

Пример 1. Работа с БД:

try:
    connection = connect_to_db()
except ConnectionError:
    print("Не удалось подключиться к БД")
else:
    print("Подключение успешно")
    query = connection.execute("SELECT * FROM users")

Пример 2. Обработка данных из файла:

def process_data(filename):
    try:
        with open(filename, "r") as file:
            lines = file.readlines()
    except FileNotFoundError:
        print("Файл не найден")
        return
    else:
        print(f"Обработка {len(lines)} строк")
        for line in lines:
            process_line(line)

Задачи для закрепления

Задача 1. Напиши программу, которая преобразует строку в число. При успехе выведи «Преобразование успешно», при ошибке — «Ошибка».

Задача 2. Напиши программу, которая открывает файл. При успехе выведи «Файл открыт», при ошибке — «Файл не найден».

Задача 3. В чём разница между else и finally?

Задача 4. Напиши функцию, которая делит два числа. При успехе выводит результат, при ошибке — сообщение об ошибке.

Задача 5. Когда выполняется блок else в try-except?

Ответы:

Задача 1.

try:
    num = int(input("Введите число: "))
except ValueError:
    print("Ошибка")
else:
    print("Преобразование успешно")
    print(f"Число: {num}")

Задача 2.

try:
    with open("file.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Файл не найден")
else:
    print("Файл открыт")

Задача 3.

# else — выполняется только при успехе
# finally — выполняется всегда

Задача 4.

def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Ошибка: деление на ноль")
    else:
        print(f"Результат: {result}")
        return result

Задача 5.

# Блок else выполняется, если в блоке try не было ошибок

Нюансы и подводные камни

Ошибки в else не обрабатываются

try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка")
else:
    result = 1 / 0   # Ошибка не обрабатывается!

Если код в else может вызвать ошибку — оберни его в отдельный try.

Порядок блоков

try:
    # код
except:
    # код
else:
    # код
finally:
    # код

else не обязателен

try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка")
# else не нужен

Частые ошибки и как их избежать

Ошибка 1: Путаница else в try и else в if

if x > 0:
    print("Положительное")
else:
    print("Не положительное")

try:
    result = 10 / x
except ZeroDivisionError:
    print("Ошибка")
else:   # Это другой else!
    print("Успех")

Ошибка 2: Неправильный порядок

try:
    # код
else:   # Ошибка! else должен идти после except
    # код
except:
    # код

Шпаргалка

Что нужноКак пишется
Блок при успехеelse:
Блок всегдаfinally:
Порядок блоковtry → except → else → finally

Заключение / Выводы

Сегодня мы узнали:

  • Блок else выполняется при успехе
  • Отличие else от finally
  • else делает код чище
  • Правильный порядок блоков

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×