Обработка исключений
Базовый try/except
try: # начало блока с обработкой исключений
result = 10 / 0
except ZeroDivisionError: # обработка исключения
print("Деление на ноль!") # вывод в консоль
try: # начало блока с обработкой исключений
num = int(input("Введите число: ")) # преобразование в целое
except ValueError: # обработка исключения
print("Это не число!") # вывод в консоль
Несколько except
try: # начало блока с обработкой исключений
value = risky_operation() # присваивание
except ValueError: # обработка исключения
print("Неверное значение") # вывод в консоль
except (TypeError, KeyError):
print("Ошибка типа или ключа") # вывод в консоль
except Exception as e: # обработка исключения
print(f"Неизвестная ошибка: {e}") # вывод в консоль
else: # иначе
print(f"Всё ок: {value}") # вывод в консоль
finally: # выполняется в любом случае
print("Выполняется всегда") # вывод в консоль
raise — выброс исключения
def divide(a, b):
if b == 0: # условие
raise ValueError("Деление на ноль") # выброс исключения
return a / b # возврат значения
# Переброс
try: # начало блока с обработкой исключений
divide(10, 0)
except ValueError: # обработка исключения
print("Ошибка") # вывод в консоль
raise
Пользовательские исключения
class CustomError(Exception):
"""Базовое исключение приложения."""
pass # пустая заглушка
class ValidationError(CustomError):
def __init__(self, field: str, message: str):
self.field = field # обращение к атрибуту экземпляра
self.message = message # обращение к атрибуту экземпляра
super().__init__(f"{field}: {message}") # вызов родительского метода
raise ValidationError("email", "Неверный формат") # выброс исключения
Иерархия исключений
BaseException
├── SystemExit
├── KeyboardInterrupt
├── GeneratorExit
└── Exception
├── StopIteration
├── ArithmeticError
│ ├── ZeroDivisionError
│ └── OverflowError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── ValueError
├── TypeError
├── OSError
│ └── FileNotFoundError
├── AttributeError
└── ...
Exception Groups (Python 3.11+)
def validate(data):
errors = [] # инициализация списка
if not data.get("name"): # условие
errors.append(ValueError("name required")) # добавление в конец
if not data.get("age"): # условие
errors.append(ValueError("age required")) # добавление в конец
if errors: # условие
raise ExceptionGroup("Validation failed", errors) # выброс исключения
try: # начало блока с обработкой исключений
validate({"name": ""})
except* ValueError as eg: # перехват группы исключений
for e in eg.exceptions: # цикл по элементам
print(e) # вывод в консоль
Контекстный менеджер try/except/finally
# try — опасный код
# except — обработка ошибки
# else — если ошибки не было
# finally — в любом случае
try: # начало блока с обработкой исключений
file = open("data.txt") # открытие файла
data = file.read() # присваивание
except FileNotFoundError: # обработка исключения
print("Файл не найден") # вывод в консоль
else: # иначе
print(f"Прочитано {len(data)} символов") # вывод в консоль
finally: # выполняется в любом случае
file.close()