Spec-Zone.ru › Python 3.12

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

В 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 можно задать с помощью аргументов, переданных конструктору только по имени. Если они заданы, то представляют соответственно имя атрибута, к которому пытались получить доступ, и объект, у которого пытались получить этот атрибут.

Изменено в версии 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 можно задать с помощью аргумента, переданного конструктору только по имени. Если он задан, то представляет имя переменной, к которой пытались получить доступ.

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

exception NotImplementedError

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

Примечание

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

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

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

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

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

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

Конструктор часто фактически возвращает подкласс 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 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._exit() можно использовать, если немедленный выход абсолютно необходим (например, в дочернем процессе после вызова os.fork()).

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

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

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)

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

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

Вложенная структура текущего исключения сохраняется в результате, как и значения его атрибутов message, __traceback__, __cause__, __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

Обратите внимание, что 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
      │    └── 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/exceptions.html

Spec-Zone.ru

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