Встроенные исключения
В 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 -
Вызывается, когда операция завершается из-за отсутствия памяти, но ситуация может быть исправлена (путем удаления некоторых объектов). Соответствующее значение — строка, указывающая тип (внутренней) операции, у которой закончилась память. Обратите внимание, что из-за архитектуры управления памятью (функции C's
malloc()), интерпретатор может не всегда полностью восстановиться от этой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, если причиной была неуправляемая программа.
-
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, как описано в OS exceptions ниже. Конкретный подкласс зависит от конечного значенияerrno. Это поведение проявляется только при прямом созданииOSErrorили через псевдоним, и не наследуется при наследовании.-
errno -
Числовой код ошибки из переменной C
errno.
-
winerror -
В Windows это даёт вам исходный код ошибки Windows. Атрибут
errnoпредставляет собой приблизительный перевод этого кода ошибки в терминах POSIX.В Windows, если аргумент конструктора winerror является целым числом, атрибут
errnoопределяется из кода ошибки Windows, и аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, и атрибутwinerrorне существует.
-
strerror -
Соответствующее сообщение об ошибке, предоставленное операционной системой. Оно форматируется функциями C
perror()в POSIX иFormatMessage()в Windows.
-
filename -
filename2 -
Для исключений, связанных с путём к файлу (например,
open()илиos.unlink()),filename— это имя файла, переданное в функцию. Для функций, которые включают два пути к файлам (такие какos.rename()),filename2соответствует второму имени файла, переданному в функцию.
Изменено в версии 3.3:
EnvironmentError,IOError,WindowsError,socket.error,select.errorиmmap.errorбыли объединены вOSError, и конструктор может возвращать подкласс.Изменено в версии 3.4: Атрибут
filenameтеперь содержит исходное имя файла, переданное в функцию, вместо кодированного или декодированного имени в filesystem encoding and error handler. Также добавлен аргумент и атрибут конструктора 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: Преобразование
StopIterationвRuntimeErrorвключено по умолчанию для всего кода: ошибкаStopIteration, возникающая в генераторе, преобразуется вRuntimeError. -
-
exception StopAsyncIteration -
Должно быть вызвано методом
__anext__()объекта асинхронного итератора для остановки итерации.Введено в версии 3.5.
-
exception SyntaxError(message, details) -
Вызывается, когда анализатор сталкивается с синтаксической ошибкой. Это может произойти в операторе
import, при вызове встроенных функцийcompile(),exec()илиeval(), или при чтении исходного скрипта или стандартного ввода (в интерактивном режиме).Свойство
str()экземпляра исключения возвращает только сообщение об ошибке. Атрибут `details` — это кортеж, члены которого также доступны как отдельные атрибуты.-
filename -
Имя файла, в котором произошла синтаксическая ошибка.
-
lineno -
Номер строки в файле, где произошла ошибка. Индексация начинается с 1: первой строке файла соответствует номер
lineno.
-
offset -
Номер столбца в строке, где произошла ошибка. Индексация начинается с 1: первому символу строки соответствует номер
offset.
-
text -
Текст исходного кода, связанный с ошибкой.
-
end_lineno -
Номер строки в файле, где заканчивается область ошибки. Индексация начинается с 1: первой строке файла соответствует номер
lineno.
-
end_offset -
Номер столбца в последней строке, где заканчивается область ошибки. Индексация начинается с 1: первому символу строки соответствует номер
offset.
Для ошибок в полях 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 -
Вызывается, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не кажется настолько серьезной, чтобы заставлять его отказываться от всех надежд. Соответствующее значение — это строка, указывающая, что пошло не так (в терминах низкого уровня).
Вы должны сообщить об этом автору или системному администратору вашей интерпретатора Python. Убедитесь, что вы указали версию интерпретатора Python (
sys.version; она также выводится в начале интерактивной сессии Python), точное сообщение об ошибке (соответствующее значение исключения) и, если возможно, исходный код программы, которая вызвала ошибку.
-
exception SystemExit -
Это исключение вызывается функцией
sys.exit(). Оно наследуется отBaseException, а не отException, чтобы оно не было случайно перехвачено кодом, ловящимException. Это позволяет исключению корректно распространяться вверх и заставлять интерпретатор завершиться. Если оно не обрабатывается, интерпретатор Python завершается; отладочная информация стека не выводится. Конструктор принимает тот же необязательный аргумент, что иsys.exit(). Если значение является целым числом, оно определяет код завершения системы (передается в функцию Cexit()); если это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’s
ENOTCAPABLEтеперь отображается какPermissionError.
-
exception ProcessLookupError -
Вызывается, когда заданный процесс не существует. Соответствует
errnoESRCH.
-
exception TimeoutError -
Вызывается, когда системная функция превысила системный лимит времени. Соответствует
errnoETIMEDOUT.
Добавлена в версии 3.3: Все вышеперечисленные подклассы OSError были добавлены.
См. также
PEP 3151 - Переработка иерархии исключений ОС и Ввода-вывода
Предупреждения
Следующие исключения используются в качестве категорий предупреждений; см. документацию по Категории предупреждений для получения более подробной информации.
-
exception Warning -
Базовый класс для категорий предупреждений.
-
exception UserWarning -
Базовый класс для предупреждений, сгенерированных кодом пользователя.
-
exception DeprecationWarning -
Базовый класс для предупреждений о устаревших функциях, когда эти предупреждения предназначены для других разработчиков Python.
Игнорируется стандартными фильтрами предупреждений, за исключением модуля %%%CODE_BLOCK_308%% (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 -
Базовый класс для предупреждений, связанных с кодировками.
См. Поддерживаемые предупреждения 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/exceptions.html