Справочник Python

Полное руководство по языку на русском

Обработка исключений

Базовый 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()