Перейти к основному содержимому

Распространённые типы исключений

Разработчику Архитектору
Сначала

Механизм try/except и определения — Обработка исключений в Python, общая теория — Ошибки, исключения и отказоустойчивость. Здесь — справочник типов.


Распространённые типы исключений

Интерактивное демо — сценарии на Python (try / except): раскрутка стека и перехват. Подробнее: ошибки и исключения.

Play ITЗагрузка интерактивного демо…

Связь с теорией

Имена классов ниже — конкретизация исключительных ситуаций из общей модели (ошибки и исключения).

Синтаксис перехвата — Обработка исключений в Python.

В Python все встроенные исключения находятся в модуле builtins. Полный список встроенных имён:


import builtins

print(dir(builtins))

Этот список включает не только исключения, но и другие встроенные объекты (например, True, False, None, int, str и т.д.). Чтобы выделить именно типы ошибок (исключения), нужно отфильтровать элементы, имена которых заканчиваются на Error или Warning.


Список встроенных исключений (ошибок) в Python 3.12+

Основные базовые классы

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

Исключения, наследующие Exception

  • ArithmeticError
    • FloatingPointError
    • OverflowError
    • ZeroDivisionError
  • AssertionError
  • AttributeError
  • BufferError
  • EOFError
  • 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
    • RecursionError
  • StopIteration
  • SyntaxError
    • IndentationError
      • TabError
  • SystemError
  • TypeError
  • ValueError
    • UnicodeError
      • UnicodeDecodeError
      • UnicodeEncodeError
      • UnicodeTranslateError
  • WindowsError (только на Windows, устаревшее в новых версиях, заменено на OSError)

Предупреждения (Warnings)

  • Warning
    • UserWarning
    • DeprecationWarning
    • PendingDeprecationWarning
    • SyntaxWarning
    • RuntimeWarning
    • FutureWarning
    • ImportWarning
    • UnicodeWarning
    • BytesWarning
    • ResourceWarning

Примечания

  • Некоторые исключения, такие как GeneratorExit, KeyboardInterrupt, SystemExit, наследуются непосредственно от BaseException, а не от Exception. Их обычно не перехватывают в общих блоках except Exception, так как они сигнализируют о завершении программы или прерывании с клавиатуры.
  • В современных версиях Python (3.10+) структура исключений стабильна, но могут добавляться новые подклассы (например, ModuleNotFoundError был добавлен в Python 3.6).
  • Для получения точного списка в вашей версии Python используйте фильтрацию:

import builtins

errors = [name for name in dir(builtins) if name.endswith('Error') or name.endswith('Warning')]
for err in sorted(errors):
print(err)

Это обеспечит актуальность списка для вашей среды исполнения.


Разбор исключений с примерами

ArithmeticError

  • Что это — базовый класс для арифметических ошибок.
  • Когда возникает — при ошибках вычислений в числовых операциях.
  • Пример кода — # базовый класс обычно не выбрасывают напрямую.
  • Разбор кода — чаще всего перехватывают конкретные подклассы: ZeroDivisionError, OverflowError.

FloatingPointError

  • Что это — ошибка операций с плавающей точкой на низком уровне.
  • Когда возникает — при специальных настройках численных библиотек или FPU.
  • Пример кода — import math; math.sqrt(-1.0).
  • Разбор кода — в обычном Python чаще получаете ValueError, а FloatingPointError встречается редко.

OverflowError

  • Что это — переполнение при численных преобразованиях.
  • Когда возникает — когда число не помещается в ожидаемый диапазон.
  • Пример кода — import math; math.exp(1000).
  • Разбор кода — math.exp(1000) выходит за пределы представимого значения и вызывает переполнение.

ZeroDivisionError

  • Что это — деление на ноль.
  • Когда возникает — при /, // или %, если делитель равен нулю.
  • Пример кода — 1 / 0.
  • Разбор кода — оператор деления проверяет делитель и прерывает выполнение при нуле.

AssertionError

  • Что это — ошибка проваленной проверки assert.
  • Когда возникает — если условие в assert ложно.
  • Пример кода — assert 2 + 2 == 5.
  • Разбор кода — утверждение не выполнено, поэтому интерпретатор поднимает AssertionError.

AttributeError

  • Что это — обращение к несуществующему атрибуту объекта.
  • Когда возникает — при obj.attr, если такого атрибута нет.
  • Пример кода — 'abc'.append('d').
  • Разбор кода — у строки нет метода append, поэтому обращение завершается ошибкой.

BufferError

  • Что это — ошибка буферных операций.
  • Когда возникает — когда буфер занят и не может быть изменён.
  • Пример кода — # редкий случай при низкоуровневой работе с buffer protocol.
  • Разбор кода — чаще встречается при работе с memoryview и расширениями на C.

EOFError

  • Что это — достигнут конец ввода.
  • Когда возникает — input() ожидает данные, а поток завершился.
  • Пример кода — input() в закрытом stdin.
  • Разбор кода — функция чтения ждёт строку, но получает сигнал конца файла.

ImportError

  • Что это — общая ошибка импорта.
  • Когда возникает — модуль найден, но импорт завершился неуспешно.
  • Пример кода — from math import not_existing_name.
  • Разбор кода — модуль math загружен, но имя в нём отсутствует.

ModuleNotFoundError

  • Что это — специализированный случай ImportError.
  • Когда возникает — когда Python не находит модуль в sys.path.
  • Пример кода — import very_unknown_module.
  • Разбор кода — интерпретатор проходит пути поиска и не находит нужный пакет.

LookupError

  • Что это — базовый класс ошибок поиска по ключу или индексу.
  • Когда возникает — в операциях доступа к элементам коллекций.
  • Пример кода — # обычно ловят KeyError или IndexError.
  • Разбор кода — удобно для общего перехвата ошибок поиска без детализации типа.

IndexError

  • Что это — выход индекса за границы последовательности.
  • Когда возникает — при обращении к несуществующей позиции списка/кортежа.
  • Пример кода — [1, 2][5].
  • Разбор кода — у списка длина 2, индекс 5 недопустим.

KeyError

  • Что это — отсутствие ключа в словаре.
  • Когда возникает — при dict[key], если ключ не существует.
  • Пример кода — {'a': 1}['b'].
  • Разбор кода — словарь не содержит 'b', поэтому выбрасывается KeyError.

MemoryError

  • Что это — нехватка доступной памяти.
  • Когда возникает — при попытке выделить слишком большой объём памяти.
  • Пример кода — a = [0] * (10**10).
  • Разбор кода — интерпретатор запрашивает память у ОС и получает отказ.

NameError

  • Что это — имя не определено в текущей области видимости.
  • Когда возникает — при обращении к необъявленной переменной.
  • Пример кода — print(unknown_var).
  • Разбор кода — интерпретатор не находит имя в local, global и builtins.

UnboundLocalError

  • Что это — частный случай NameError для локальной переменной.
  • Когда возникает — переменная объявлена локальной, но чтение происходит до присваивания.
  • Пример кода — def f(): print(x); x = 1; f().
  • Разбор кода — внутри f имя x считается локальным, но читается раньше записи.

OSError

  • Что это — общий класс ошибок операционной системы.
  • Когда возникает — при проблемах файловой системы, сети, процессов и прав.
  • Пример кода — open('/root/secret.txt').
  • Разбор кода — конкретный подкласс зависит от причины: PermissionError, FileNotFoundError и другие.

BlockingIOError

  • Что это — операция ввода-вывода блокируется.
  • Когда возникает — в неблокирующем режиме, когда данные пока недоступны.
  • Пример кода — # сокет в non-blocking режиме читает пустой буфер.
  • Разбор кода — операция корректна, но её нужно повторить позже.

ChildProcessError

  • Что это — ошибки работы с дочерними процессами.
  • Когда возникает — при ожидании/управлении процессом в неверном состоянии.
  • Пример кода — os.waitpid(999999, 0).
  • Разбор кода — процесс с таким PID отсутствует среди дочерних.

ConnectionError

  • Что это — базовый класс сетевых ошибок соединения.
  • Когда возникает — при сбоях установки или поддержания TCP-соединения.
  • Пример кода — # обычно выбрасываются подклассы ниже.
  • Разбор кода — удобен для общего перехвата сетевых проблем одним блоком.

BrokenPipeError

  • Что это — запись в разорванный канал.
  • Когда возникает — когда другая сторона канала закрыла соединение.
  • Пример кода — # запись в сокет после закрытия peer.
  • Разбор кода — локальная сторона пытается отправить данные в уже закрытый поток.

ConnectionAbortedError

  • Что это — соединение прервано локально или промежуточной инфраструктурой.
  • Когда возникает — при аварийном обрыве соединения во время обмена данными.
  • Пример кода — # соединение оборвано во время передачи.
  • Разбор кода — TCP-сессия прекращается до завершения операции.

ConnectionRefusedError

  • Что это — удалённый хост отверг подключение.
  • Когда возникает — порт закрыт или сервис не слушает.
  • Пример кода — import socket; socket.create_connection(('127.0.0.1', 1)).
  • Разбор кода — SYN получает отказ, поэтому соединение не устанавливается.

ConnectionResetError

  • Что это — соединение сброшено удалённой стороной.
  • Когда возникает — peer отправляет RST или аварийно закрывает сокет.
  • Пример кода — # чтение/запись в сокет после reset.
  • Разбор кода — текущая TCP-сессия принудительно завершена.

FileExistsError

  • Что это — файл или каталог уже существует.
  • Когда возникает — при операциях создания с требованием уникальности.
  • Пример кода — import os; os.mkdir('tmp'); os.mkdir('tmp').
  • Разбор кода — второй вызов пытается создать уже существующую директорию.

FileNotFoundError

  • Что это — путь не найден.
  • Когда возникает — при чтении/удалении несуществующего файла.
  • Пример кода — open('missing.txt').
  • Разбор кода — ОС не находит объект по указанному пути.

InterruptedError

  • Что это — системный вызов прерван сигналом.
  • Когда возникает — длительная операция остановлена внешним сигналом.
  • Пример кода — # редкий случай при системных вызовах.
  • Разбор кода — операцию обычно повторяют после обработки сигнала.

IsADirectoryError

  • Что это — операция с файлом вызвана для директории.
  • Когда возникает — когда ожидается файл, но путь указывает на каталог.
  • Пример кода — open('.').
  • Разбор кода — функция open в режиме чтения файла получает директорию.

NotADirectoryError

  • Что это — операция с директорией вызвана для файла.
  • Когда возникает — в пути ожидается каталог, но встречается обычный файл.
  • Пример кода — import os; os.listdir(__file__).
  • Разбор кода — os.listdir требует директорию, а __file__ обычно файл.

PermissionError

  • Что это — недостаточно прав доступа.
  • Когда возникает — при чтении, записи или выполнении без нужных разрешений.
  • Пример кода — open('/root/secret.txt').
  • Разбор кода — ОС блокирует операцию из-за прав пользователя.

ProcessLookupError

  • Что это — процесс не найден.
  • Когда возникает — при попытке отправить сигнал несуществующему PID.
  • Пример кода — import os, signal; os.kill(999999, signal.SIGTERM).
  • Разбор кода — ядро не находит процесс с указанным идентификатором.

TimeoutError

  • Что это — превышено время ожидания операции.
  • Когда возникает — при сетевых и I/O-операциях с тайм-аутом.
  • Пример кода — import socket; socket.create_connection(('10.255.255.1', 81), timeout=0.01).
  • Разбор кода — операция не завершилась за установленный интервал.

ReferenceError

  • Что это — недействительная слабая ссылка (weakref).
  • Когда возникает — объект уже удалён, а к нему обращаются через weak reference.
  • Пример кода — # чаще в коде с weakref и кэшем объектов.
  • Разбор кода — слабая ссылка не удерживает объект в памяти, поэтому цель может исчезнуть.

RuntimeError

  • Что это — ошибка времени выполнения, не попавшая в более узкий класс.
  • Когда возникает — при некорректном состоянии во время работы программы.
  • Пример кода — raise RuntimeError('unexpected state').
  • Разбор кода — разработчик явно сигнализирует о нарушении контрактов выполнения.

NotImplementedError

  • Что это — метод или ветка логики пока не реализованы.
  • Когда возникает — в абстрактных базовых классах и заглушках.
  • Пример кода — def save(): raise NotImplementedError.
  • Разбор кода — функция вызвана до реализации, поэтому выбрасывается исключение-заглушка.

RecursionError

  • Что это — превышена максимальная глубина рекурсии.
  • Когда возникает — рекурсивная функция не достигает базового случая.
  • Пример кода — def f(): return f(); f().
  • Разбор кода — стек вызовов растёт до лимита sys.getrecursionlimit().

StopIteration

  • Что это — сигнал завершения итератора.
  • Когда возникает — next(iterator) вызывается после исчерпания элементов.
  • Пример кода — it = iter([]); next(it).
  • Разбор кода — у пустого итератора нет следующего элемента, цикл for перехватывает это автоматически.

SyntaxError

  • Что это — ошибка синтаксиса исходного кода.
  • Когда возникает — парсер не может разобрать конструкцию.
  • Пример кода — eval('if True print(1)').
  • Разбор кода — выражение нарушает правила синтаксиса Python.

IndentationError

  • Что это — ошибка отступов в блоках кода.
  • Когда возникает — структура блоков нарушена по пробелам.
  • Пример кода — exec('def f():\nprint(1)').
  • Разбор кода — тело функции должно иметь отступ относительно def.

TabError

  • Что это — конфликт табов и пробелов в отступах.
  • Когда возникает — интерпретатор получает неоднозначную структуру блока.
  • Пример кода — # смешанные табы и пробелы в одном блоке.
  • Разбор кода — Python требует консистентные отступы внутри каждого блока.

SystemError

  • Что это — внутренняя ошибка интерпретатора или C-расширения.
  • Когда возникает — при некорректной работе низкоуровневого кода.
  • Пример кода — # в чистом Python почти не воспроизводится.
  • Разбор кода — обычно указывает на баг в CPython или стороннем расширении.

TypeError

  • Что это — операция применена к объекту неподходящего типа.
  • Когда возникает — когда API ожидает один тип, а получает другой.
  • Пример кода — '2' + 2.
  • Разбор кода — Python не выполняет сложение str и int без явного преобразования.

ValueError

  • Что это — тип корректен, но значение недопустимо.
  • Когда возникает — при передаче значения вне допустимого диапазона/формата.
  • Пример кода — int('abc').
  • Разбор кода — функция int() ожидает числовую строку, 'abc' не подходит.

UnicodeError

  • Что это — базовый класс ошибок кодировок Unicode.
  • Когда возникает — при декодировании, кодировании и трансляции текста.
  • Пример кода — # обычно выбрасываются специализированные подклассы.
  • Разбор кода — для точной диагностики используют UnicodeDecodeError, UnicodeEncodeError, UnicodeTranslateError.

UnicodeDecodeError

  • Что это — ошибка декодирования байтов в строку.
  • Когда возникает — байты не соответствуют выбранной кодировке.
  • Пример кода — b'\xff'.decode('utf-8').
  • Разбор кода — байт 0xff недопустим в UTF-8 в такой позиции.

UnicodeEncodeError

  • Что это — ошибка кодирования строки в байты.
  • Когда возникает — символы строки отсутствуют в целевой кодировке.
  • Пример кода — 'Привет'.encode('ascii').
  • Разбор кода — ASCII поддерживает только базовые латинские символы.

UnicodeTranslateError

  • Что это — ошибка трансляции Unicode-символов.
  • Когда возникает — во время специальных преобразований/таблиц трансляции.
  • Пример кода — # редкий случай в низкоуровневой обработке текста.
  • Разбор кода — механизм трансляции не может корректно обработать конкретный символ.

WindowsError

  • Что это — исторический алиас для Windows-специфичных OSError.
  • Когда возникает — в старом коде и старых версиях Python на Windows.
  • Пример кода — # в современном коде используйте OSError.
  • Разбор кода — в актуальных версиях Python практическая замена для этого имени уже встроена в OSError.

Примеры кода для исключений

Ниже собраны короткие воспроизводимые примеры в формате try / except.

ArithmeticError

try:
import math
math.exp(1000) # обычно даёт OverflowError (подкласс ArithmeticError)
except ArithmeticError as e:
print(type(e).__name__, e)

OverflowError

try:
import math
math.exp(1000)
except OverflowError as e:
print(type(e).__name__, e)

ZeroDivisionError

try:
result = 10 / 0
except ZeroDivisionError as e:
print(type(e).__name__, e)

AssertionError

try:
assert 2 + 2 == 5, "ожидали корректную сумму"
except AssertionError as e:
print(type(e).__name__, e)

AttributeError

try:
"abc".append("d")
except AttributeError as e:
print(type(e).__name__, e)

ImportError и ModuleNotFoundError

try:
from math import unknown_symbol
except ImportError as e:
print("ImportError:", e)

try:
import definitely_missing_module
except ModuleNotFoundError as e:
print("ModuleNotFoundError:", e)

IndexError

try:
values = [1, 2, 3]
print(values[10])
except IndexError as e:
print(type(e).__name__, e)

KeyError

try:
user = {"name": "Tim"}
print(user["email"])
except KeyError as e:
print(type(e).__name__, e)

NameError

try:
print(not_defined_variable)
except NameError as e:
print(type(e).__name__, e)

UnboundLocalError

def demo():
try:
print(x)
x = 1
except UnboundLocalError as e:
print(type(e).__name__, e)

demo()

FileNotFoundError

try:
with open("missing_file.txt", "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError as e:
print(type(e).__name__, e)

FileExistsError


import os

try:
os.mkdir("tmp_example_dir")
os.mkdir("tmp_example_dir")
except FileExistsError as e:
print(type(e).__name__, e)
finally:
if os.path.isdir("tmp_example_dir"):
os.rmdir("tmp_example_dir")

IsADirectoryError

try:
with open(".", "r", encoding="utf-8") as f:
print(f.read())
except IsADirectoryError as e:
print(type(e).__name__, e)

NotADirectoryError


import os

try:
os.listdir(__file__)
except NotADirectoryError as e:
print(type(e).__name__, e)

PermissionError

try:
# Подберите путь без прав доступа в вашей системе.
with open("/root/secret.txt", "r", encoding="utf-8") as f:
print(f.read())
except PermissionError as e:
print(type(e).__name__, e)
except FileNotFoundError:
print("На этой машине путь не существует, используйте защищённый путь вашей ОС.")

TimeoutError


import socket

try:
socket.create_connection(("10.255.255.1", 81), timeout=0.01)
except TimeoutError as e:
print(type(e).__name__, e)
except OSError as e:
# На некоторых сетях может прийти другой OSError
print(type(e).__name__, e)

RecursionError

def recurse():
return recurse()

try:
recurse()
except RecursionError as e:
print(type(e).__name__, e)

StopIteration

try:
it = iter([])
next(it)
except StopIteration as e:
print(type(e).__name__, e)

TypeError

try:
print("2" + 2)
except TypeError as e:
print(type(e).__name__, e)

ValueError

try:
print(int("abc"))
except ValueError as e:
print(type(e).__name__, e)

UnicodeDecodeError

try:
print(b"\xff".decode("utf-8"))
except UnicodeDecodeError as e:
print(type(e).__name__, e)

UnicodeEncodeError

try:
print("Привет".encode("ascii"))
except UnicodeEncodeError as e:
print(type(e).__name__, e)

SyntaxError

try:
eval("if True print(1)")
except SyntaxError as e:
print(type(e).__name__, e)

IndentationError

try:
exec("def f():\nprint(1)")
except IndentationError as e:
print(type(e).__name__, e)

OSError и подклассы

try:
import os
os.remove("definitely_missing_file.txt")
except OSError as e:
# Часто это будет FileNotFoundError
print(type(e).__name__, e)

RuntimeError и NotImplementedError

try:
raise RuntimeError("unexpected state")
except RuntimeError as e:
print(type(e).__name__, e)

try:
raise NotImplementedError("method must be implemented in subclass")
except NotImplementedError as e:
print(type(e).__name__, e)

Важное уточнение по редким исключениям

FloatingPointError, BufferError, ReferenceError, InterruptedError, SystemError, ConnectionResetError и часть других исключений зависят от среды, ОС, сети, C-расширений и режима запуска. Для них в разделе выше остаётся концептуальный разбор, а рабочие воспроизводимые примеры требуют отдельного стенда.