Встроенные исключения

В Python все исключения должны быть экземплярами класса, производного от BaseException. В операторе try с предложением Exception, в котором упоминается конкретный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, из которых он является производным). Два класса исключений, не связанные созданием подклассов, никогда не являются эквивалентными, даже если они имеют одно и то же имя.

Встроенные исключения, перечисленные в этой главе, могут быть сгенерированы интерпретатором или встроенными функциями. Если не указано иное, они имеют «связанное значение», указывающее подробную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, кода ошибки и строки, объясняющей код). Соответствующее значение обычно передается в качестве аргумента конструктору класса исключений.

Пользовательский код может вызывать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке, «точно так же, как» ситуация, в которой интерпретатор вызывает то же исключение; но помните, что нет ничего, что могло бы помешать пользовательскому коду вызвать недопустимую ошибку.

Встроенные классы исключений могут быть разделены на подклассы для определения новых исключений; программистам рекомендуется создавать новые исключения из класса Exception или одного из его подклассов, а не из BaseException. Дополнительную информацию об определении исключений можно найти в руководстве по Python в разделе Пользовательские исключения.

Контекст исключения

Три атрибута объектов исключений предоставляют информацию о контексте, в котором возникло исключение:

BaseException.__context__
BaseException.__cause__
BaseException.__suppress_context__

При возникновении нового исключения, когда другое исключение уже обрабатывается, атрибуту __context__ нового исключения автоматически присваивается значение обработанного исключения. Исключение может быть обработано при использовании предложения Exception или finally, или оператора with.

Этот контекст неявного исключения можно дополнить явной причиной, используя from с raise:

поднять new_exc из original_exc

Выражение, следующее за from, должно быть исключением или Нет. В возникшем исключении он будет установлен как __cause__. Установка __cause__ также неявно устанавливает для атрибута __suppress_context__ значение True, так что использование raise new_exc from None эффективно заменяет старое исключение новым для целей отображения. (например, преобразование KeyError в AttributeError), оставляя старое исключение доступным в __context__ для самоанализа при отладке.

Код отображения обратной трассировки по умолчанию отображает эти цепочки исключений в дополнение к обратной трассировке самого исключения. Явно связанное исключение в __cause__ всегда отображается, если оно присутствует. Неявно связанное исключение в __context__ отображается только в том случае, если __cause__ имеет значение None и __suppress_context__ имеет значение false.

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

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

Пользовательский код может создавать подклассы, наследуемые от типа исключения. Рекомендуется одновременно создавать подкласс только одного типа исключения, чтобы избежать любых возможных конфликтов между тем, как базы обрабатывают атрибут args, а также из-за возможной несовместимости структуры памяти.

Большинство встроенных исключений для повышения эффективности реализованы на языке C, см.: Objects/Exceptions.c. Некоторые из них имеют собственную структуру памяти, что делает невозможным создание подкласса, наследуемого от нескольких типов исключений. Расположение памяти типа является деталью реализации и может меняться в разных версиях Python, что приведет к новым конфликтам в будущем. Поэтому рекомендуется вообще избегать создания подклассов нескольких типов исключений.

Базовые классы

Следующие исключения используются в основном как базовые классы для других исключений.

exception BaseException

Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования определяемыми пользователем классами (для этого используйте Exception). Если str() вызывается для экземпляра этого класса, возвращается представление аргумента(ов) экземпляра или пустая строка, если аргументов нет.

args

Кортеж аргументов, передаваемых конструктору исключения. Некоторые встроенные исключения (например, OSError) ожидают определенное количество аргументов и присваивают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, дающей сообщение об ошибке.

with_traceback(tb)

Этот метод устанавливает tb в качестве новой трассировки исключения и возвращает объект исключения. Он чаще использовался до того, как стали доступны функции цепочки исключений PEP 3134. В следующем примере показано, как мы можем преобразовать экземпляр SomeException в экземпляр OtherException, сохраняя при этом обратную трассировку. После возникновения текущий кадр помещается в обратную трассировку OtherException, как это произошло бы с обратной трассировкой исходного SomeException, если бы мы позволили ему распространиться на вызывающую сторону.

try:
    ...
except SomeException:
    tb = sys.exception().__traceback__
    raise OtherException(...).with_traceback(tb)
__traceback__

Доступное для записи поле, содержащее объект трассировки, связанный с этим исключением. См. также: Инструкция raise.

add_note(note)

Добавьте строку note к примечаниям об исключении, которые появляются в стандартной обратной трассировке после строки исключения. Ошибка TypeError возникает, если note не является строкой.

Добавлено в версии 3.11.

__notes__

Список примечаний этого исключения, которые были добавлены с помощью add_note(). Этот атрибут создается при вызове add_note().

Добавлено в версии 3.11.

exception Exception

Все встроенные исключения, не выходящие из системы, являются производными от этого класса. Все определяемые пользователем исключения также должны быть производными от этого класса.

exception ArithmeticError

Базовый класс для встроенных исключений, возникающих при различных арифметических ошибках: OverflowError, ZeroDivisionError, FloatingPointError.

exception BufferError

Возникает, когда операция, связанная с buffer, не может быть выполнена.

exception LookupError

Базовый класс для исключений, которые возникают, когда ключ или индекс, используемые в сопоставлении или последовательности, недействительны: IndexError, KeyError. Его можно вызвать непосредственно с помощью codecs.lookup().

Конкретные исключения

Следующие исключения представляют собой исключения, которые обычно возникают.

exception AssertionError

Возникает, когда оператор assert не работает.

exception AttributeError

Возникает, когда ссылка на атрибут (см. Attribute references) или присвоение завершаются неудачно. (Когда объект вообще не поддерживает ссылки на атрибуты или назначения атрибутов, возникает TypeError.)

The name and obj attributes can be set using keyword-only arguments to the constructor. When set they represent the name of the attribute that was attempted to be accessed and the object that was accessed for said attribute, respectively.

Изменено в версии 3.10: Добавлены атрибуты name и obj.

exception EOFError

Raised when the input() function hits an end-of-file condition (EOF) without reading any data. (N.B.: the io.IOBase.read() and io.IOBase.readline() methods return an empty string when they hit EOF.)

exception FloatingPointError

В настоящее время не используется.

exception GeneratorExit

Возникает, когда закрывается generator или coroutine; см. generator.close() и coroutine.close(). Он напрямую наследуется от BaseException вместо Exception, поскольку технически это не ошибка.

exception ImportError

Возникает, когда у оператора import возникают проблемы при загрузке модуля. Также возникает, когда имя «from list» в from ... import не может быть найдено.

Необязательные аргументы name и path, содержащие только ключевые слова, устанавливают соответствующие атрибуты:

name

Имя модуля, который была предпринята попытка импортировать.

path

Путь к любому файлу, вызвавшему исключение.

Изменено в версии 3.3: Добавлены атрибуты name и path.

exception ModuleNotFoundError

Подкласс ImportError, который вызывается import, когда модуль не может быть найден. Он также возникает, когда в sys.modules обнаружено None.

Добавлено в версии 3.6.

exception IndexError

Возникает, когда индекс последовательности выходит за пределы допустимого диапазона. (Индексы срезов автоматически усекаются, чтобы попасть в разрешенный диапазон; если индекс не является целым числом, возникает TypeError.)

exception KeyError

Возникает, когда ключ сопоставления (словаря) не найден в наборе существующих ключей.

exception KeyboardInterrupt

Вызывается, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно производится проверка на прерывания. Исключение наследуется от BaseException, чтобы случайно не быть перехваченным кодом, который перехватывает Exception и тем самым предотвратить выход интерпретатора.

Примечание

Перехват KeyboardInterrupt требует особого внимания. Поскольку его можно вызвать в непредсказуемые моменты, в некоторых случаях он может привести работающую программу в несогласованное состояние. Обычно лучше разрешить KeyboardInterrupt завершать программу как можно быстрее или вообще избегать ее запуска. (См. обработчики-и-исключения.)

exception MemoryError

Возникает, когда операции не хватает памяти, но ситуацию еще можно спасти (путем удаления некоторых объектов). Соответствующее значение представляет собой строку, указывающую, для какой (внутренней) операции закончилась память. Обратите внимание, что из-за базовой архитектуры управления памятью (функция C malloc()) интерпретатор не всегда может полностью выйти из этой ситуации; тем не менее, он вызывает исключение, чтобы можно было напечатать обратную трассировку стека, если причиной была вышедшая из-под контроля программа.

exception NameError

Возникает, когда локальное или глобальное имя не найдено. Это относится только к неполным именам. Связанное значение представляет собой сообщение об ошибке, включающее имя, которое не удалось найти.

The name attribute can be set using a keyword-only argument to the constructor. When set it represent the name of the variable that was attempted to be accessed.

Изменено в версии 3.10: Добавлен атрибут name.

exception NotImplementedError

Это исключение является производным от RuntimeError. В определяемых пользователем базовых классах абстрактные методы должны вызывать это исключение, когда они требуют, чтобы производные классы переопределяли метод, или пока класс разрабатывается, чтобы указать, что реальную реализацию все еще необходимо добавить.

Примечание

Его не следует использовать для указания того, что оператор или метод вообще не должен поддерживаться — в этом случае либо оставьте оператор/метод неопределенным, либо, если это подкласс, установите для него значение None.

Осторожно

NotImplementedError и NotImplemented не являются взаимозаменяемыми. Это исключение должно использоваться только так, как описано выше; см. NotImplemented для получения подробной информации о правильном использовании встроенной константы.

exception OSError([arg])
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])

Это исключение возникает, когда системная функция возвращает системную ошибку, включая сбои ввода-вывода, такие как «файл не найден» или «диск заполнен» (не для недопустимых типов аргументов или других случайных ошибок).

Вторая форма конструктора устанавливает соответствующие атрибуты, описанные ниже. Атрибуты по умолчанию имеют значение None, если не указаны. В целях обратной совместимости, если передаются три аргумента, атрибут args содержит только кортеж из двух первых двух аргументов конструктора.

Конструктор часто фактически возвращает подкласс OSError, как описано ниже в разделе Исключения ОС. Конкретный подкласс зависит от конечного значения errno. Такое поведение возникает только при создании OSError напрямую или через псевдоним и не наследуется при создании подклассов.

errno

Числовой код ошибки из переменной C errno.

winerror

В Windows это дает вам собственный код ошибки Windows. Атрибут errno представляет собой приблизительный перевод в терминах POSIX этого собственного кода ошибки.

В Windows, если аргумент конструктора winerror является целым числом, атрибут errno определяется по коду ошибки Windows, а аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, а атрибут winerror не существует.

strerror

The corresponding error message, as provided by the operating system. It is formatted by the C functions perror() under POSIX, and FormatMessage() under Windows.

filename
filename2

Для исключений, связанных с путем к файловой системе (например, open() или os.unlink()), filename — это имя файла, передаваемое функции. Для функций, которые используют два пути файловой системы (например, os.rename()), filename2 соответствует второму имени файла, переданному функции.

Изменено в версии 3.3: EnvironmentError, IOError, WindowsError, socket.error, select.error and mmap.error have been merged into OSError, and the constructor may return a subclass.

Изменено в версии 3.4: Атрибут filename теперь является исходным именем файла, передаваемым в функцию, а не именем, закодированным или декодированным из кодирования файловой системы и обработчика ошибок. Кроме того, были добавлены аргумент и атрибут конструктора filename2.

exception OverflowError

Возникает, когда результат арифметической операции слишком велик для представления. Это не может произойти с целыми числами (которые скорее вызовут MemoryError, чем сдадутся). Однако по историческим причинам OverflowError иногда возникает для целых чисел, выходящих за пределы требуемого диапазона. Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой не проверяются.

exception RecursionError

Это исключение является производным от RuntimeError. Он возникает, когда интерпретатор обнаруживает, что максимальная глубина рекурсии (см. sys.getrecursionlimit()) превышена.

Добавлено в версии 3.5: Ранее возникало простое сообщение RuntimeError.

exception ReferenceError

Это исключение возникает, когда слабый ссылочный прокси, созданный функцией weakref.proxy(), используется для доступа к атрибуту референта после его сборки мусора. Дополнительную информацию о слабых ссылках см. в модуле weakref.

exception RuntimeError

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

exception StopIteration

Вызывается встроенной функцией next() и методом iterator__next__(), чтобы сигнализировать о том, что итератор больше не создает элементов.

value

Объект исключения имеет единственный атрибут value, который передается в качестве аргумента при создании исключения и по умолчанию имеет значение None.

Когда функция generator или coroutine возвращает значение, создается новый экземпляр StopIteration, и значение, возвращаемое функцией, используется в качестве параметра value для конструктор исключения.

Если код генератора прямо или косвенно вызывает StopIteration, он преобразуется в RuntimeError (сохраняя StopIteration как причину нового исключения).

Изменено в версии 3.3: Добавлен атрибут value и возможность функций-генераторов использовать его для возврата значения.

Изменено в версии 3.5: Введено преобразование RuntimeError через from __future__ importgenerator_stop, см. PEP 479.

Изменено в версии 3.7: Включите PEP 479 для всего кода по умолчанию: ошибка StopIteration, возникающая в генераторе, преобразуется в RuntimeError.

exception StopAsyncIteration

Должен быть вызван методом __anext__() объекта асинхронного итератора, чтобы остановить итерацию.

Добавлено в версии 3.5.

exception SyntaxError(message, details)

Возникает, когда синтаксический анализатор обнаруживает синтаксическую ошибку. Это может произойти в операторе import, при вызове встроенных функций compile(), exec() или eval() или при чтении исходного скрипта. или стандартный ввод (также в интерактивном режиме).

str() экземпляра исключения возвращает только сообщение об ошибке. Details — это кортеж, члены которого также доступны как отдельные атрибуты.

filename

Имя файла, в котором произошла синтаксическая ошибка.

lineno

В каком номере строки в файле произошла ошибка. Индексируется 1: первая строка в файле имеет lineno, равный 1.

offset

Столбец в строке, в которой произошла ошибка. Это индекс 1: первый символ в строке имеет смещение, равное 1.

text

Текст исходного кода, связанный с ошибкой.

end_lineno

На каком номере строки в файле заканчивается ошибка. Это индекс 1: первая строка в файле имеет lineno, равный 1.

end_offset

Столбец в конечной строке, в котором произошла ошибка, заканчивается. Это индекс 1: первый символ в строке имеет смещение, равное 1.

В случае ошибок в полях f-строки сообщение начинается с префикса «f-строка:», а смещения представляют собой смещения в тексте, созданном на основе выражения замены. Например, компиляция поля f’Bad {ab}“ приводит к следующему атрибуту args: („f-string: …“, („“, 1, 2, „(ab)n“, 1, 5)) .

Изменено в версии 3.10: Добавлены атрибуты end_lineno и end_offset.

exception IndentationError

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

exception TabError

Возникает, когда отступ содержит непоследовательное использование табуляции и пробелов. Это подкласс IndentationError.

exception SystemError

Поднимается, когда интерпретатор находит внутреннюю ошибку, но ситуация не выглядит настолько серьезно, чтобы заставить ее отказаться от всей надежды. Связанное значение-это строка, указывающая, что пошло не так (в условиях низкого уровня). В: Термин: cpython, это может быть поднято неправильно, используя API Python C, такой как возврат значения` null` без набора исключений.

Если вы уверены, что это исключение не ваша вина или вина в пакете, которую вы используете, вы должны сообщить об этом автору или сопровождающему вашего интерпретатора Python. Обязательно сообщите о версии интерпретатора Python (`` sys.version``; она также напечатана в начале интерактивного сеанса Python), точное сообщение об ошибке (связанное значение исключения) и, если возможно, источник Программа, которая вызвала ошибку.

exception SystemExit

This exception is raised by the sys.exit() function. It inherits from BaseException instead of Exception so that it is not accidentally caught by code that catches Exception. This allows the exception to properly propagate up and cause the interpreter to exit. When it is not handled, the Python interpreter exits; no stack traceback is printed. The constructor accepts the same optional argument passed to sys.exit(). If the value is an integer, it specifies the system exit status (passed to C’s exit() function); if it is None, the exit status is zero; if it has another type (such as a string), the object’s value is printed and the exit status is one.

Вызов sys.exit() преобразуется в исключение, чтобы можно было выполнить обработчики очистки (предложения finally операторов try) и чтобы отладчик мог выполнить сценарий без риска потери контроля. Функцию os._exit() можно использовать, если абсолютно необходимо немедленно завершить работу (например, в дочернем процессе после вызова os.fork()).

code

Статус завершения или сообщение об ошибке, передаваемое конструктору. (По умолчанию «Нет».)

exception TypeError

Возникает, когда операция или функция применяется к объекту неподходящего типа. Связанное значение представляет собой строку, предоставляющую подробную информацию о несоответствии типов.

Это исключение может быть вызвано пользовательским кодом, чтобы указать, что попытка операции с объектом не поддерживается и не должна поддерживаться. Если объект предназначен для поддержки данной операции, но еще не предоставил реализацию, подходящим исключением является исключение NotImplementedError.

Передача аргументов неправильного типа (например, передача list, когда ожидается int) должна привести к TypeError, но передача аргументов с неправильным значением (например, числом вне ожидаемые границы) должно привести к ошибке ValueError.

exception UnboundLocalError

Возникает, когда делается ссылка на локальную переменную в функции или методе, но к этой переменной не привязано никакое значение. Это подкласс NameError.

exception UnicodeError

Возникает при возникновении ошибки кодирования или декодирования, связанной с Unicode. Это подкласс ValueError.

UnicodeError имеет атрибуты, описывающие ошибку кодирования или декодирования. Например, err.object[err.start:err.end] дает конкретный недопустимый входной сигнал, с которым произошел сбой кодека.

encoding

Название кодировки, из-за которой возникла ошибка.

reason

Строка, описывающая конкретную ошибку кодека.

object

Объект, который кодек пытался закодировать или декодировать.

start

Первый индекс недопустимых данных в object.

end

Индекс после последних недопустимых данных в object.

exception UnicodeEncodeError

Возникает, когда во время кодирования возникает ошибка, связанная с Unicode. Это подкласс UnicodeError.

exception UnicodeDecodeError

Возникает, когда во время декодирования возникает ошибка, связанная с Unicode. Это подкласс UnicodeError.

exception UnicodeTranslateError

Возникает, когда во время перевода возникает ошибка, связанная с Unicode. Это подкласс UnicodeError.

exception ValueError

Возникает, когда операция или функция получает аргумент правильного типа, но неподходящего значения, и ситуация не описывается более точным исключением, например IndexError.

exception ZeroDivisionError

Возникает, когда второй аргумент операции деления или по модулю равен нулю. Связанное значение представляет собой строку, указывающую тип операндов и операцию.

Следующие исключения сохранены для совместимости с предыдущими версиями; начиная с Python 3.3, они являются псевдонимами OSError.

exception EnvironmentError
exception IOError
exception WindowsError

Доступно только в Windows.

Исключения операционной системы

Следующие исключения являются подклассами OSError, они возникают в зависимости от кода системной ошибки.

exception BlockingIOError

Возникает, когда операция блокируется на объекте (например, сокете), установленном для неблокирующей операции. Соответствует errno EAGAIN, EALREADY, EWOULDBLOCK и :py:const :~errno.EINPROGRESS.

В дополнение к атрибутам OSError, BlockingIOError может иметь еще один атрибут:

characters_written

An integer containing the number of characters written to the stream before it blocked. This attribute is available when using the buffered I/O classes from the io module.

exception ChildProcessError

Возникает, когда операция над дочерним процессом завершилась неудачно. Соответствует errno ECHILD.

exception ConnectionError

Базовый класс для проблем, связанных с подключением.

Подклассами являются BrokenPipeError, ConnectionAbortedError, ConnectionRefusedError и ConnectionResetError.

exception BrokenPipeError

Подкласс ConnectionError, возникающий при попытке записи в канал, когда другой конец закрыт, или при попытке записи в сокет, который был отключен для записи. Соответствует errno EPIPE и ESHUTDOWN.

exception ConnectionAbortedError

Подкласс ConnectionError, вызываемый, когда попытка соединения прерывается узлом. Соответствует errno ECONNABORTED.

exception ConnectionRefusedError

Подкласс ConnectionError, вызываемый, когда попытка соединения отклонена узлом. Соответствует errno ECONNREFUSED.

exception ConnectionResetError

Подкласс ConnectionError, вызываемый при сбросе соединения партнером. Соответствует errno ECONNRESET.

exception FileExistsError

Возникает при попытке создать файл или каталог, который уже существует. Соответствует errno EEXIST.

exception FileNotFoundError

Возникает, когда файл или каталог запрошен, но не существует. Соответствует errno ENOENT.

exception InterruptedError

Возникает, когда системный вызов прерывается входящим сигналом. Соответствует errno EINTR.

Изменено в версии 3.5: Python теперь повторяет системные вызовы, когда системный вызов прерывается сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (обоснование см. в PEP 475), вместо вызова InterruptedError.

exception IsADirectoryError

Возникает, когда в каталоге запрашивается файловая операция (например, os.remove()). Соответствует errno EISDIR.

exception NotADirectoryError

Возникает, когда операция с каталогом (например, os.listdir()) запрашивается для чего-то, что не является каталогом. На большинстве платформ POSIX он также может возникнуть, если операция пытается открыть или просмотреть файл, не являющийся каталогом, как если бы это был каталог. Соответствует errno ENOTDIR.

exception PermissionError

Возникает при попытке запустить операцию без соответствующих прав доступа, например разрешений файловой системы. Соответствует errno EACCES, EPERM и ENOTCAPABLE.

Изменено в версии 3.11.1: ENOTCAPABLE WASI теперь сопоставлен с PermissionError.

exception ProcessLookupError

Возникает, когда данный процесс не существует. Соответствует errno ESRCH.

exception TimeoutError

Возникает, когда на системном уровне истекло время ожидания системной функции. Соответствует errno ETIMEDOUT.

Добавлено в версии 3.3: Были добавлены все вышеперечисленные подклассы OSError.

См. также

PEP 3151 - Переработка иерархии исключений ОС и ввода-вывода.

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

Следующие исключения используются в качестве категорий предупреждений; дополнительную информацию см. в документации Warning Categories.

exception Warning

Базовый класс для категорий предупреждений.

exception UserWarning

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

exception DeprecationWarning

Базовый класс для предупреждений об устаревших функциях, если эти предупреждения предназначены для других разработчиков Python.

Игнорируется фильтрами предупреждений по умолчанию, за исключением модуля __main__ (PEP 565). Включение Режима разработки Python отображает это предупреждение.

Политика прекращения поддержки описана в PEP 387.

exception PendingDeprecationWarning

Базовый класс для предупреждений об устаревших функциях, которые, как ожидается, станут устаревшими в будущем, но не устарели в данный момент.

Этот класс используется редко, поскольку выдача предупреждения о возможном предстоящем прекращении поддержки является необычной, и DeprecationWarning предпочтительнее для уже активных исключений.

Игнорируется фильтрами предупреждений по умолчанию. Включение Режима разработки Python отображает это предупреждение.

Политика прекращения поддержки описана в PEP 387.

exception SyntaxWarning

Базовый класс для предупреждений о сомнительном синтаксисе.

exception RuntimeWarning

Базовый класс для предупреждений о сомнительном поведении во время выполнения.

exception FutureWarning

Базовый класс для предупреждений об устаревших функциях, если эти предупреждения предназначены для конечных пользователей приложений, написанных на Python.

exception ImportWarning

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

Игнорируется фильтрами предупреждений по умолчанию. Включение Режима разработки Python отображает это предупреждение.

exception UnicodeWarning

Базовый класс для предупреждений, связанных с Unicode.

exception EncodingWarning

Базовый класс для предупреждений, связанных с кодировками.

Подробности см. в Opt-in EncodingWarning.

Добавлено в версии 3.10.

exception BytesWarning

Базовый класс для предупреждений, связанных с bytes и bytearray.

exception ResourceWarning

Базовый класс для предупреждений, связанных с использованием ресурсов.

Игнорируется фильтрами предупреждений по умолчанию. Включение Режима разработки Python отображает это предупреждение.

Добавлено в версии 3.2.

Группы исключений

Следующие действия используются, когда необходимо вызвать несколько несвязанных исключений. Они являются частью иерархии исключений, поэтому их можно обрабатывать с помощью Exception, как и все другие исключения. Кроме того, они распознаются по Exception*, который соответствует их подгруппам на основе типов содержащихся исключений.

exception ExceptionGroup(msg, excs)
exception BaseExceptionGroup(msg, excs)

Оба этих типа исключений заключают исключения в последовательность excs. Параметр msg должен быть строкой. Разница между этими двумя классами заключается в том, что BaseExceptionGroup расширяет BaseException и может обертывать любое исключение, тогда как ExceptionGroup расширяет Exception и может обертывать только подклассы : exc:Исключение. Эта конструкция устроена так, что кроме Exception перехватывается ExceptionGroup, но не BaseExceptionGroup.

Конструктор BaseExceptionGroup возвращает ExceptionGroup вместо BaseExceptionGroup, если все содержащиеся исключения являются экземплярами Exception, поэтому его можно использовать для автоматического выбора. С другой стороны, конструктор ExceptionGroup вызывает TypeError, если какое-либо содержащееся исключение не является подклассом Exception.

message

Аргумент конструктора msg. Это атрибут, доступный только для чтения.

exceptions

Кортеж исключений в последовательности excs, переданный конструктору. Это атрибут, доступный только для чтения.

subgroup(condition)

Возвращает группу исключений, содержащую только те исключения из текущей группы, которые соответствуют условию, или «Нет», если результат пуст.

The condition can be either a function that accepts an exception and returns true for those that should be in the subgroup, or it can be an exception type or a tuple of exception types, which is used to check for a match using the same check that is used in an except clause.

В результате сохраняется структура вложения текущего исключения, а также значения его message, __traceback__, __cause__, :attr:` Поля ~BaseException.__context__` и __notes__. Пустые вложенные группы исключаются из результата.

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

split(condition)

Аналогично subgroup(), но возвращает пару (match, rest), где match — это subgroup(condition), а rest — оставшаяся несовпадающая часть.

derive(excs)

Возвращает группу исключений с тем же message, но которая оборачивает исключения в excs.

Этот метод используется subgroup() и split(), которые используются в различных контекстах для разделения группы исключений. Подкласс должен переопределить его, чтобы subgroup() и split() возвращали экземпляры подкласса, а не ExceptionGroup.

subgroup() и split() копируют __traceback__, __cause__, __context__ и __notes__ из исходной группы исключений в группу, возвращаемую derive(), поэтому эти поля не нужно обновлять с помощью derive().

>>> class MyGroup(ExceptionGroup):
...     def derive(self, excs):
...         return MyGroup(self.message, excs)
...
>>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
>>> e.add_note("a note")
>>> e.__context__ = Exception("context")
>>> e.__cause__ = Exception("cause")
>>> try:
...    raise e
... except Exception as e:
...    exc = e
...
>>> match, rest = exc.split(ValueError)
>>> exc, exc.__context__, exc.__cause__, exc.__notes__
(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> match, match.__context__, match.__cause__, match.__notes__
(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
>>> rest, rest.__context__, rest.__cause__, rest.__notes__
(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
True

Note that BaseExceptionGroup defines __new__(), so subclasses that need a different constructor signature need to override that rather than __init__(). For example, the following defines an exception group subclass which accepts an exit_code and and constructs the group’s message from it.

class Errors(ExceptionGroup):
   def __new__(cls, errors, exit_code):
      self = super().__new__(Errors, f"exit code: {exit_code}", errors)
      self.exit_code = exit_code
      return self

   def derive(self, excs):
      return Errors(excs, self.exit_code)

Как и ExceptionGroup, любой подкласс BaseExceptionGroup, который также является подклассом Exception, может обертывать только экземпляры Exception.

Добавлено в версии 3.11.

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

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

BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── 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
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning