Статьи

Учебные материалы по языку Python — от основ до продвинутых тем

Иерархия исключений

Страница 32 из 34 · 2026-10-26 · 4 мин чтения

BaseException

Все исключения наследуются от BaseException. Атрибуты и методы:

ЭлементОписание
argsКортеж аргументов, переданных конструктору
with_traceback(tb)Возвращает исключение с заданным traceback
add_note(note)Добавляет заметку (Python 3.11+)
__notes__Список заметок
__cause__Причина, заданная через raise ... from ...
__context__Исключение, при обработке которого возникло текущее
__traceback__Объект traceback
__suppress_context__Скрывать ли контекст при выводе
try:    int("abc")except ValueError as e:    print(e.args)    print(type(e).__name__)    print(str(e))    print(repr(e))

Иерархия встроенных исключений

BaseException├── BaseExceptionGroup├── GeneratorExit├── KeyboardInterrupt├── SystemExit└── Exception    ├── ArithmeticError    │   ├── FloatingPointError    │   ├── OverflowError    │   └── ZeroDivisionError    ├── AssertionError    ├── AttributeError    ├── BufferError    ├── EOFError    ├── ExceptionGroup    ├── ImportError    │   └── ModuleNotFoundError    ├── LookupError    │   ├── IndexError    │   └── KeyError    ├── MemoryError    ├── NameError    │   └── UnboundLocalError    ├── OSError    │   ├── BlockingIOError    │   ├── ChildProcessError    │   ├── ConnectionError    │   │   ├── BrokenPipeError    │   │   ├── ConnectionAbortedError    │   │   ├── ConnectionRefusedError    │   │   └── ConnectionResetError    │   ├── FileExistsError    │   ├── FileNotFoundError    │   ├── InterruptedError    │   ├── IsADirectoryError    │   ├── NotADirectoryError    │   ├── PermissionError    │   ├── ProcessLookupError    │   └── TimeoutError    ├── ReferenceError    ├── RuntimeError    │   ├── NotImplementedError    │   ├── PythonFinalizationError    │   └── RecursionError    ├── StopAsyncIteration    ├── StopIteration    ├── SyntaxError    │   └── IndentationError    │       └── TabError    ├── SystemError    ├── TypeError    ├── ValueError    │   └── UnicodeError    │       ├── UnicodeDecodeError    │       ├── UnicodeEncodeError    │       └── UnicodeTranslateError    └── Warning        ├── BytesWarning        ├── DeprecationWarning        ├── EncodingWarning        ├── FutureWarning        ├── ImportWarning        ├── PendingDeprecationWarning        ├── ResourceWarning        ├── RuntimeWarning        ├── SyntaxWarning        ├── UnicodeWarning        └── UserWarning

Исключение PythonFinalizationError появилось в Python 3.13. Состав иерархии может немного отличаться между версиями.

Самые частые исключения

ИсключениеКогда возникаетПример
ValueErrorПравильный тип, но недопустимое значениеint("abc")
TypeErrorОперация применена к неподходящему типу"a" + 1
KeyErrorНет ключа в словаре{}["x"]
IndexErrorИндекс вне диапазона[][0]
AttributeErrorНет атрибутаNone.x
NameErrorИмя не определеноprint(zzz)
ZeroDivisionErrorДеление на ноль1 / 0
FileNotFoundErrorНет файлаopen("no.txt")
ImportErrorОшибка импортаfrom os import zzz
StopIterationИтератор исчерпанnext(iter([]))
RecursionErrorПревышена глубина рекурсиибесконечная рекурсия
NotImplementedErrorМетод должен быть переопределёнв абстрактных методах
AssertionErrorНе выполнено assertassert 1 == 2
KeyboardInterruptНажато Ctrl+C
SystemExitВызван sys.exit()

Перехват

Порядок блоков except важен: первым срабатывает подходящий:

def safe_div(a, b):    try:        return a / b    except ZeroDivisionError:        return None    except TypeError as e:        print("типы:", e)        return None    except Exception as e:        print("прочее:", e)        raise    else:        print("успешно")    finally:        print("готово")print(safe_div(1, 0))print(safe_div(1, "a"))

Базовые классы перехватывают потомков:

try:    [][0]except LookupError as e:    print(type(e).__name__)

Цепочки исключений

class ConfigError(Exception):    passdef load(path):    try:        return open(path).read()    except OSError as e:        raise ConfigError(f"не удалось прочитать {path}") from etry:    load("missing.txt")except ConfigError as e:    print(e)    print(repr(e.__cause__))
  • raise X from Y задаёт явную причину
  • raise X from None скрывает контекст
  • raise без аргументов повторно выбрасывает текущее исключение

Собственные исключения

class AppError(Exception):    passclass ValidationError(AppError):    def __init__(self, field, message):        super().__init__(f"{field}: {message}")        self.field = field        self.message = messagetry:    raise ValidationError("email", "некорректный адрес")except AppError as e:    print(e)    print(e.field)

Хорошая практика — иметь один базовый класс исключений для проекта.

Заметки к исключениям

try:    try:        int("x")    except ValueError as e:        e.add_note("при разборе параметра port")        raiseexcept ValueError as e:    print(e.__notes__)

ExceptionGroup и except*

Python 3.11 добавил возможность собирать несколько исключений в группу:

def run():    raise ExceptionGroup("несколько ошибок", [        ValueError("a"),        TypeError("b"),        ValueError("c"),    ])try:    run()except* ValueError as eg:    print("ValueError:", [str(e) for e in eg.exceptions])except* TypeError as eg:    print("TypeError:", [str(e) for e in eg.exceptions])

Группы нужны прежде всего для асинхронного кода, где несколько задач могут завершиться ошибкой одновременно.

Атрибуты отдельных исключений

try:    open("missing.txt")except FileNotFoundError as e:    print(e.errno)    print(e.strerror)    print(e.filename)try:    "é".encode("ascii")except UnicodeEncodeError as e:    print(e.encoding, e.reason, e.start, e.end)try:    import nothing_hereexcept ImportError as e:    print(e.name)

suppress

Если исключение нужно просто проигнорировать:

from contextlib import suppressimport oswith suppress(FileNotFoundError):    os.remove("temp.txt")

Предупреждения

Warning и его потомки — исключения-предупреждения, которыми управляет модуль warnings:

import warningswarnings.warn("функция устарела", DeprecationWarning, stacklevel=2)warnings.simplefilter("error")

Задания

  1. Напишите иерархию исключений для библиотеки работы с платежами.
  2. Реализуйте функцию, которая оборачивает системные ошибки файловых операций в собственное исключение, сохраняя причину.
  3. Соберите ошибки валидации формы в ExceptionGroup и обработайте через except*.