Встроенные исключения
В 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 -
Путь к файлу, вызвавшему исключение.
-
-
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 -
Возникает, когда операция блокируется на объекте (например, сокете), настроенном для неблокирующего режима. Соответствует
errnoEAGAIN,EALREADY,EWOULDBLOCKиEINPROGRESS.Помимо атрибутов
OSError, уBlockingIOErrorможет быть ещё один атрибут:-
characters_written -
Целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании классов буферизованного ввода-вывода из модуля
io.
-
-
exception ChildProcessError -
Возникает при сбое операции с дочерним процессом. Соответствует
errnoECHILD.
-
exception ConnectionError -
Базовый класс для проблем, связанных с соединением.
Подклассы:
BrokenPipeError,ConnectionAbortedError,ConnectionRefusedErrorиConnectionResetError.
-
exception BrokenPipeError -
Подкласс
ConnectionError; возникает при попытке записи в канал, другой конец которого закрыт, или при попытке записи в сокет, запись в который была отключена. СоответствуетerrnoEPIPEиESHUTDOWN.
-
exception ConnectionAbortedError -
Подкласс
ConnectionError; возникает, когда другая сторона прерывает попытку установить соединение. СоответствуетerrnoECONNABORTED.
-
exception ConnectionRefusedError -
Подкласс
ConnectionError; возникает, когда другая сторона отклоняет попытку установить соединение. СоответствуетerrnoECONNREFUSED.
-
exception ConnectionResetError -
Подкласс
ConnectionError; возникает, когда другая сторона сбрасывает соединение. СоответствуетerrnoECONNRESET.
-
exception FileExistsError -
Возникает при попытке создать файл или каталог, который уже существует. Соответствует
errnoEEXIST.
-
exception FileNotFoundError -
Возникает, когда запрашивается файл или каталог, которого не существует. Соответствует
errnoENOENT.
-
exception InterruptedError -
Возникает, когда системный вызов прерывается поступившим сигналом. Соответствует
errnoEINTR.Изменено в версии 3.5: Теперь Python повторяет системные вызовы, прерванные сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (обоснование см. в PEP 475), вместо вызова
InterruptedError.
-
exception IsADirectoryError -
Возникает, когда файловая операция (например,
os.remove()) запрашивается для каталога. СоответствуетerrnoEISDIR.
-
exception NotADirectoryError -
Возникает, когда операция с каталогом (например,
os.listdir()) запрашивается для объекта, который не является каталогом. На большинстве POSIX-платформ исключение также может возникнуть, если операция пытается открыть файл, не являющийся каталогом, или перейти по нему так, будто это каталог. СоответствуетerrnoENOTDIR.
-
exception PermissionError -
Возникает при попытке выполнить операцию без необходимых прав доступа, например при отсутствии разрешений файловой системы. Соответствует
errnoEACCES,EPERMиENOTCAPABLE.Изменено в версии 3.11.1: Теперь код ошибки WASI
ENOTCAPABLEпреобразуется вPermissionError.
-
exception ProcessLookupError -
Возникает, когда указанный процесс не существует. Соответствует
errnoESRCH.
-
exception TimeoutError -
Возникает, когда системная функция превышает тайм-аут на уровне системы. Соответствует
errnoETIMEDOUT.
Добавлено в версии 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 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