Распространённые типы исключений
Механизм 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
ArithmeticErrorFloatingPointErrorOverflowErrorZeroDivisionError
AssertionErrorAttributeErrorBufferErrorEOFErrorImportErrorModuleNotFoundError
LookupErrorIndexErrorKeyError
MemoryErrorNameErrorUnboundLocalError
OSErrorBlockingIOErrorChildProcessErrorConnectionErrorBrokenPipeErrorConnectionAbortedErrorConnectionRefusedErrorConnectionResetError
FileExistsErrorFileNotFoundErrorInterruptedErrorIsADirectoryErrorNotADirectoryErrorPermissionErrorProcessLookupErrorTimeoutError
ReferenceErrorRuntimeErrorNotImplementedErrorRecursionError
StopIterationSyntaxErrorIndentationErrorTabError
SystemErrorTypeErrorValueErrorUnicodeErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeTranslateError
WindowsError(только на Windows, устаревшее в новых версиях, заменено наOSError)
Предупреждения (Warnings)
WarningUserWarningDeprecationWarningPendingDeprecationWarningSyntaxWarningRuntimeWarningFutureWarningImportWarningUnicodeWarningBytesWarningResourceWarning
Примечания
- Некоторые исключения, такие как
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-расширений и режима запуска. Для них в разделе выше остаётся концептуальный разбор, а рабочие воспроизводимые примеры требуют отдельного стенда.