← Назад к вопросам
Какие блоки для обработки исключений есть в Python?
1.6 Junior🔥 211 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Блоки для обработки исключений в Python
Python предоставляет несколько конструкций для обработки ошибок и исключений: try, except, else, finally и context managers с with.
Базовая конструкция try-except
# Простой случай: перехватываем исключение
try:
result = 10 / 0 # ZeroDivisionError
except ZeroDivisionError:
print("Деление на ноль!")
result = 0
# Результат: "Деление на ноль!" и result = 0
Несколько except блоков
# Разные обработчики для разных исключений
try:
data = {"name": "John"}
age = int(data["age"])
except KeyError:
print("Ключ не найден в словаре")
except ValueError:
print("Не могу преобразовать в число")
except Exception as e:
print(f"Неизвестная ошибка: {e}")
# Можно обрабатывать несколько исключений в одном блоке
try:
value = int("abc")
except (ValueError, TypeError):
print("Ошибка преобразования")
Блок else - выполняется если ошибки НЕ было
# else выполняется только если НЕ было исключения в try
try:
number = int("42")
except ValueError:
print("Ошибка преобразования")
else:
# Выполняется ТОЛЬКО если try прошёл успешно
print(f"Число успешно преобразовано: {number}")
print(f"Число в квадрате: {number ** 2}")
Блок finally - выполняется ВСЕГДА
# finally выполняется в любом случае (с исключением или без)
def read_file(filename):
try:
file = open(filename, "r")
data = file.read()
print(f"Прочитано: {len(data)} символов")
except FileNotFoundError:
print("Файл не найден")
data = None
finally:
# Выполнится всегда, даже при исключении
if "file" in locals():
file.close()
print("Файл закрыт")
read_file("data.txt")
# Результат:
# Файл не найден
# Файл закрыт
Полная конструкция try-except-else-finally
def process_user_data(user_input):
try:
# Попытка выполнить опасную операцию
age = int(user_input)
print("Парсинг прошёл успешно")
except ValueError:
# Выполняется если было исключение
print("Ошибка: введите число")
age = None
else:
# Выполняется если в try НЕ было исключений
if age < 0:
raise ValueError("Возраст не может быть отрицательным")
print(f"Возраст валидный: {age}")
finally:
# Выполняется ВСЕГДА
print("Обработка данных завершена\n")
process_user_data("25") # Всё ок
process_user_data("abc") # Ошибка в try
Доступ к информации об исключении
# Доступ к объекту исключения
try:
result = 1 / 0
except ZeroDivisionError as e:
print(f"Тип ошибки: {type(e).__name__}")
print(f"Сообщение: {str(e)}")
print(f"Args: {e.args}")
# Получение полного traceback
import traceback
try:
data = {"key": "value"}
print(data["missing"])
except KeyError:
# Получить весь stack trace
traceback.print_exc()
# Или как строку
error_message = traceback.format_exc()
print(error_message)
Кастомные исключения
# Определение своего исключения
class InvalidAgeError(Exception):
"""Исключение для невалидного возраста"""
pass
class InsufficientFundsError(Exception):
"""Исключение для недостатка средств"""
def __init__(self, balance: float, required: float):
self.balance = balance
self.required = required
super().__init__(f"Баланс {balance}, требуется {required}")
# Использование кастомных исключений
def transfer_money(account, amount: float):
try:
if amount > account.balance:
raise InsufficientFundsError(account.balance, amount)
account.balance -= amount
print(f"Переведено {amount}")
except InsufficientFundsError as e:
print(f"Ошибка: {e}")
print(f"Баланс: {e.balance}, нужно: {e.required}")
Context managers (with) для автоматической очистки
# with автоматически вызывает __exit__ даже при ошибке
with open("file.txt", "r") as f:
data = f.read()
# Файл автоматически закроется
# Кастомный context manager
class Database:
def __enter__(self):
print("Подключение к БД...")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Отключение от БД...")
if exc_type is not None:
print(f"Ошибка: {exc_type.__name__}")
return False # Пробросить исключение дальше
with Database() as db:
print("Работа с БД")
# При выходе вызовется __exit__
Переброс исключений (raise)
# Переброс исключения дальше
try:
result = process_data()
except ValueError:
print("Обработана ошибка")
raise # Переброс дальше
# Цепочка исключений
try:
file = open("missing.txt")
except FileNotFoundError as e:
raise RuntimeError("Не могу прочитать конфиг") from e
Порядок выполнения блоков
| Сценарий | try | except | else | finally |
|---|---|---|---|---|
| Нет ошибок | ✅ | ❌ | ✅ | ✅ |
| Есть исключение | ❌ | ✅ | ❌ | ✅ |
| Исключение в except | ❌ | ❌ (переброс) | ❌ | ✅ |
Это основной механизм для надёжной обработки ошибок в Python приложениях.