Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Конструкция try-except-else в Python
Try-except-else — это расширенный механизм обработки исключений в Python, который позволяет разделить код на три части: попытка выполнения (try), обработка ошибок (except) и выполнение если ошибок не было (else).
Структура конструкции
try:
# Код, который может вызвать исключение
result = 10 / 2
except ZeroDivisionError:
# Выполняется ТОЛЬКО если произойдёт исключение
print("Ошибка: деление на ноль")
else:
# Выполняется ТОЛЬКО если исключения НЕ было
print(f"Результат: {result}")
finally:
# Выполняется ВСЕГДА (опционально)
print("Операция завершена")
Ключевое отличие: когда выполняется else
# Пример 1: ошибка ИЛИ нет ошибки?
try:
x = int("abc") # Это вызовет ValueError
except ValueError:
print("Не смогли преобразовать в число") # Выполнится это
else:
print("Успешно преобразовали") # А это НЕ выполнится
finally:
print("Блок finally всегда выполняется") # Это выполнится
# Вывод:
# Не смогли преобразовать в число
# Блок finally всегда выполняется
# Пример 2: если ошибки нет
try:
x = int("123") # Успешно
except ValueError:
print("Не смогли преобразовать в число") # Это НЕ выполнится
else:
print(f"Успешно преобразовали: {x}") # Это выполнится
finally:
print("Блок finally всегда выполняется") # Это выполнится
# Вывод:
# Успешно преобразовали: 123
# Блок finally всегда выполняется
Практические примеры
Пример 1: Чтение файла с проверкой
try:
with open("data.txt", "r", encoding="utf-8") as f:
data = f.read()
except FileNotFoundError:
print("Файл не найден")
except IOError:
print("Ошибка при чтении файла")
else:
# Обработка данных ТОЛЬКО если файл прочитан успешно
lines = data.split("\n")
print(f"Прочитано {len(lines)} строк")
processed_data = [line.strip() for line in lines if line.strip()]
print(f"После обработки: {len(processed_data)} строк")
finally:
print("Операция чтения завершена")
Пример 2: Подключение к БД
import psycopg2
try:
conn = psycopg2.connect(
dbname="mydb",
user="user",
password="password",
host="localhost"
)
except psycopg2.OperationalError:
print("Не удалось подключиться к БД")
except psycopg2.DatabaseError as e:
print(f"Ошибка БД: {e}")
else:
# Выполняем запросы ТОЛЬКО если соединение установлено
cursor = conn.cursor()
try:
cursor.execute("SELECT COUNT(*) FROM users")
count = cursor.fetchone()[0]
print(f"Всего пользователей: {count}")
except psycopg2.Error as e:
print(f"Ошибка при выполнении запроса: {e}")
finally:
cursor.close()
finally:
if conn:
conn.close()
print("Соединение закрыто")
Пример 3: Обработка JSON
import json
try:
with open("config.json", "r") as f:
config = json.load(f)
except FileNotFoundError:
print("Файл конфигурации не найден")
config = {}
except json.JSONDecodeError:
print("Ошибка в формате JSON")
config = {}
else:
# Используем конфигурацию ТОЛЬКО если она успешно загружена
db_host = config.get("db_host", "localhost")
db_port = config.get("db_port", 5432)
print(f"Подключение к {db_host}:{db_port}")
finally:
print("Загрузка конфигурации завершена")
Преимущества else блока
- Читаемость: ясно видно, какой код зависит от успешного выполнения try
- Разделение логики: код, который выполняется только при успехе, находится в else
- Избежание вложенности: не нужно вкладывать код в условия
- Правильная обработка исключений: else ловит исключения ТОЛЬКО в try, а не в except
Порядок выполнения
1. Выполняется блок try
2. Если исключение:
→ Выполняется try.except
→ else НЕ выполняется
→ finally выполняется
3. Если нет исключения:
→ else выполняется
→ finally выполняется
Когда использовать
- try-except-else: когда нужна специальная логика при успехе
- try-except: когда просто обрабатываем ошибку
- try-finally: когда нужна очистка ресурсов
- try-except-finally: когда нужна обработка ошибок И очистка
- try-except-else-finally: когда нужна полная контролируемость
Конструкция try-except-else часто используется в датасайенс проектах при загрузке данных, подключении к БД и парсинге файлов, где важно различать успешное выполнение от ошибок.