Spec-Zone.ru › Python 3.13

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

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

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

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

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

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

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

BaseException.__context__
BaseException.__cause__
BaseException.__suppress_context__

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

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

raise new_exc from original_exc

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

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

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

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

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

Особенность реализации CPython: Большинство встроенных исключений реализованы на 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 к примечаниям исключения, которые отображаются в стандартной трассировке стека после строки исключения. Если note не является строкой, возбуждается исключение TypeError.

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

__notes__

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

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

exception Exception

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

exception ArithmeticError

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

exception BufferError

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

exception LookupError

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

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

Следующие исключения возникают чаще всего.

exception AssertionError

Возникает, когда инструкция assert завершается неудачно.

exception AttributeError

Возникает, когда не удаётся получить ссылку на атрибут (см. Ссылки на атрибуты) или присвоить ему значение. (Если объект вообще не поддерживает ссылки на атрибуты или присваивание атрибутам, возникает исключение TypeError.)

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

name

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

obj

Объект, к атрибуту которого пытались получить доступ.

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

exception EOFError

Возникает, когда функция input() достигает конца файла (EOF), не прочитав данных. (Примечание: методы io.IOBase.read() и io.IOBase.readline() возвращают пустую строку при достижении EOF.)

exception FloatingPointError

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

exception GeneratorExit

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

exception ImportError

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

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

name

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

path

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

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

exception ModuleNotFoundError

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

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

exception IndexError

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

exception KeyError

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

exception KeyboardInterrupt

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

Примечание

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

exception MemoryError

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

exception NameError

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

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

name

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

Изменено в версии 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

Соответствующее сообщение об ошибке, предоставленное операционной системой. В POSIX оно форматируется функциями C perror(), а в Windows — FormatMessage().

filename
filename2

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

Изменено в версии 3.3: EnvironmentError, IOError, WindowsError, socket.error, select.error и mmap.error объединены в OSError, и конструктор может возвращать подкласс.

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

exception OverflowError

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

exception PythonFinalizationError

Это исключение является производным от RuntimeError. Оно возникает, когда операция блокируется во время завершения работы интерпретатора, также известного как финализация Python.

Примеры операций, которые могут быть заблокированы с возникновением PythonFinalizationError во время финализации Python:

  • Создание нового потока Python.
  • os.fork().

См. также функцию sys.is_finalizing().

Добавлено в версии 3.13: Ранее возникало обычное исключение RuntimeError.

exception RecursionError

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

Добавлено в версии 3.5: Ранее возникало обычное исключение RuntimeError.

exception ReferenceError

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

exception RuntimeError

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

exception StopIteration

Возникает во встроенной функции next() и методе __next__() итератора, чтобы сообщить об отсутствии следующих элементов, которые может выдать итератор.

value

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

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

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

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

Изменено в версии 3.5: Добавлено преобразование в RuntimeError через from __future__ import generator_stop; см. PEP 479.

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

exception StopAsyncIteration

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

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

exception SyntaxError(message, details)

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

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

filename

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

lineno

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

offset

Номер столбца в строке, в котором произошла ошибка. Отсчёт начинается с 1: номер offset первого символа строки равен 1.

text

Текст исходного кода, содержащий ошибку.

end_lineno

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

end_offset

Номер столбца в последней строке, на котором заканчивается фрагмент с ошибкой. Отсчёт начинается с 1: номер offset первого символа строки равен 1.

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

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

exception IndentationError

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

exception TabError

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

exception SystemError

Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не настолько серьёзна, чтобы отказаться от дальнейшей работы. Связанное значение — строка, указывающая, что пошло не так (на низком уровне). В CPython это исключение может возникнуть при неправильном использовании C API Python, например при возврате значения NULL без установленного исключения.

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

exception SystemExit

Это исключение вызывает функция sys.exit(). Оно наследуется от BaseException, а не от Exception, чтобы его случайно не перехватил код, обрабатывающий Exception. Благодаря этому исключение может корректно передаваться вверх по стеку и приводить к завершению интерпретатора. Если исключение не обработано, интерпретатор Python завершает работу; трассировка стека не выводится. Конструктор принимает тот же необязательный аргумент, что и функция sys.exit(). Если значение является целым числом, оно задаёт статус завершения системы (передаваемый функции exit() в C); если это None, статус завершения равен нулю; если значение имеет другой тип (например, строковый), выводится значение объекта, а статус завершения равен единице.

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

code

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

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 и EINPROGRESS.

Помимо атрибутов OSError, у BlockingIOError может быть ещё один атрибут:

characters_written

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

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 повторяет системные вызовы, прерванные сигналом, вместо возникновения InterruptedError, за исключением случаев, когда обработчик сигнала вызывает исключение (обоснование см. в PEP 475).

exception IsADirectoryError

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

exception NotADirectoryError

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

exception PermissionError

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

Изменено в версии 3.11.1: Код ошибки WASI ENOTCAPABLE теперь преобразуется в PermissionError.

exception ProcessLookupError

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

exception TimeoutError

Возникает, когда системная функция завершает работу по тайм-ауту на уровне системы. Соответствует errno ETIMEDOUT.

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

См. также

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

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

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

exception Warning

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

exception UserWarning

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

exception DeprecationWarning

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

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

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

exception PendingDeprecationWarning

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

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

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

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

exception SyntaxWarning

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

Это предупреждение обычно выдаётся при компиляции исходного кода Python и, как правило, не выводится при запуске уже скомпилированного кода.

exception RuntimeWarning

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

exception FutureWarning

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

exception ImportWarning

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

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

exception UnicodeWarning

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

exception EncodingWarning

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

Подробнее см. в разделе Предупреждение о кодировке, включаемое по запросу.

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

exception BytesWarning

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

exception ResourceWarning

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

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

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

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

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

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

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

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

message

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

exceptions

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

subgroup(condition)

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

Условием может быть тип исключения или кортеж типов исключений. В таком случае каждое исключение проверяется на соответствие с помощью той же проверки, что и в условии except. Условием также может быть вызываемый объект (не являющийся объектом типа), который принимает исключение в качестве единственного аргумента и возвращает true для исключений, которые должны войти в подгруппу.

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

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

Добавлено в версии 3.13: condition может быть любым вызываемым объектом, который не является объектом типа.

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

Обратите внимание, что BaseExceptionGroup определяет __new__(), поэтому подклассам, которым нужна другая сигнатура конструктора, следует переопределять его, а не __init__(). Например, следующий код определяет подкласс группы исключений, который принимает exit_code и формирует по нему сообщение группы.

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
      │    ├── 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

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/exceptions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API