Встроенные исключения¶
В Python все исключения должны быть экземплярами класса, который является производным от BaseException
. В операторе try
с предложением except
, в котором упоминается определенный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, из которых оно является производным). Два класса исключений, которые не связаны с помощью подклассов, никогда не являются эквивалентными, даже если они имеют одинаковое имя.
Встроенные исключения, перечисленные в этой главе, могут быть сгенерированы интерпретатором или встроенными функциями. За исключением случаев, когда это указано, они имеют «ассоциированное значение», указывающее подробную причину ошибки. Это может быть строка или набор из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Соответствующее значение обычно передается в качестве аргументов конструктору класса exception.
Пользовательский код может генерировать встроенные исключения. Это может быть использовано для тестирования обработчика исключений или для сообщения об ошибке, «точно такой же», как в ситуации, когда интерпретатор генерирует такое же исключение; но помните, что ничто не мешает пользовательскому коду генерировать недопустимую ошибку.
Встроенные классы исключений могут быть разделены на подклассы для определения новых исключений; программистам рекомендуется создавать новые исключения из класса Exception
или одного из его подклассов, а не из BaseException
. Более подробная информация об определении исключений доступна в руководстве по Python в разделе Исключения, определяемые пользователем.
Контекст исключения¶
Три атрибута объектов exception предоставляют информацию о контексте, в котором было вызвано исключение:
- 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 в качестве новой обратной трассировки для исключения и возвращает объект exception. Он чаще использовался до того, как стали доступны функции цепочки исключений PEP 3134. В следующем примере показано, как мы можем преобразовать экземпляр
SomeException
в экземплярOtherException
, сохранив обратную трассировку. После запуска текущий кадр помещается в трассировкуOtherException
, как это произошло бы с трассировкой исходногоSomeException
, если бы мы позволили ему распространиться на вызывающий объект.try: ... except SomeException: tb = sys.exception().__traceback__ raise OtherException(...).with_traceback(tb)
- __traceback__¶
Доступное для записи поле, содержащее traceback object, связанное с этим исключением. Смотрите также: Оператор raise.
- add_note(note)¶
Добавьте строку
note
в примечания к исключению, которые отображаются в стандартной обратной трассировке после строки исключения.TypeError
вызывается, еслиnote
не является строкой.Добавлено в версии 3.11.
- __notes__¶
Список примечаний к этому исключению, которые были добавлены с помощью
add_note()
. Этот атрибут создается при вызовеadd_note()
.Добавлено в версии 3.11.
- exception Exception¶
Все встроенные исключения, не связанные с выходом из системы, являются производными от этого класса. Все пользовательские исключения также должны быть производными от этого класса.
- exception ArithmeticError¶
Базовый класс для тех встроенных исключений, которые возникают при различных арифметических ошибках:
OverflowError
,ZeroDivisionError
,FloatingPointError
.
- exception LookupError¶
Базовый класс для исключений, которые создаются, когда ключ или индекс, используемые в сопоставлении или последовательности, являются недопустимыми:
IndexError
,KeyError
. Это может быть вызвано непосредственно с помощьюcodecs.lookup()
.
Конкретные исключения¶
Следующие исключения - это исключения, которые обычно возникают.
- 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 или coroutine; см.
generator.close()
иcoroutine.close()
. Он напрямую наследуется отBaseException
вместоException
, поскольку технически это не ошибка.
- exception ImportError¶
Вызывается, когда у оператора
import
возникают проблемы при попытке загрузить модуль. Также вызывается, когда «из списка» в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
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
, чем откажутся от него). Однако, по историческим причинам, ошибка переполнения иногда возникает для целых чисел, которые находятся за пределами требуемого диапазона. Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой не проверяются.
- exception RecursionError¶
Это исключение является производным от
RuntimeError
. Оно возникает, когда интерпретатор обнаруживает, что превышена максимальная глубина рекурсии (см.sys.getrecursionlimit()
).Добавлено в версии 3.5: Ранее был поднят простой
RuntimeError
.
- exception ReferenceError¶
Это исключение возникает, когда прокси-сервер со слабой ссылкой, созданный функцией
weakref.proxy()
, используется для доступа к атрибуту референта после того, как он был обработан. Дополнительные сведения о слабых ссылках см. в модулеweakref
.
- exception RuntimeError¶
Вызывается при обнаружении ошибки, которая не относится ни к одной из других категорий. Связанное значение представляет собой строку, указывающую, что именно пошло не так.
- exception StopIteration¶
Вызывается встроенной функцией
next()
и методом iterator__next__()
, чтобы сигнализировать о том, что итератор больше не генерирует элементы.- value¶
Объект exception имеет единственный атрибут
value
, который задается в качестве аргумента при создании исключения и по умолчанию равенNone
.
Когда функция возвращает значение generator или coroutine, создается новый экземпляр
StopIteration
, и значение, возвращаемое функцией, используется в качестве параметраvalue
для конструктора исключения.Если код генератора прямо или косвенно вызывает
StopIteration
, он преобразуется вRuntimeError
(сохраняяStopIteration
в качестве причины нового исключения).Изменено в версии 3.3: Добавлен атрибут
value
и возможность для функций генератора использовать его для возврата значения.Изменено в версии 3.5: Введено преобразование ошибок во время выполнения с помощью
from __future__ import generator_stop
, смотрите PEP 479.Изменено в версии 3.7: Включить PEP 479 для всего кода по умолчанию: ошибка
StopIteration
, возникшая в генераторе, преобразуется в ошибкуRuntimeError
.
- exception StopAsyncIteration¶
Должен быть вызван методом
__anext__()
объекта asynchronous iterator, чтобы остановить итерацию.Добавлено в версии 3.5.
- exception SyntaxError(message, details)¶
Вызывается, когда анализатор обнаруживает синтаксическую ошибку. Это может произойти в инструкции
import
, при вызове встроенных функцийcompile()
,exec()
, илиeval()
, или при чтении исходного сценария или стандартного ввода (также в интерактивном режиме).str()
экземпляра exception возвращает только сообщение об ошибке. Details - это кортеж, члены которого также доступны в виде отдельных атрибутов.- filename¶
Имя файла, в котором произошла синтаксическая ошибка.
- lineno¶
В каком номере строки файла произошла ошибка. Эта строка имеет индекс 1: первая строка в файле имеет значение
lineno
, равное 1.
- offset¶
Столбец в строке, в которой произошла ошибка. Этот символ имеет индекс 1: первый символ в строке имеет значение
offset
, равное 1.
- text¶
Текст исходного кода, связанный с ошибкой.
- end_lineno¶
На какой номер строки в файле заканчивается ошибка, вызванная возникновением ошибки. Это значение имеет индекс 1: первая строка в файле имеет значение
lineno
, равное 1.
- end_offset¶
Столбец в последней строке, в котором произошла ошибка, заканчивается. Он имеет индекс 1: первый символ в строке имеет значение
offset
, равное 1.
Для ошибок в полях f-string сообщение имеет префикс «f-string: «, а смещения - это смещения в тексте, построенном на основе заменяющего выражения. Например, компиляция f’Bad {a b} field“ приводит к такому атрибуту args: („f-строка: …“, (», 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¶
Объект, который кодек пытался закодировать или декодировать.
- exception UnicodeEncodeError¶
Вызывается, когда во время кодирования возникает ошибка, связанная с Unicode. Это подкласс
UnicodeError
.
- exception UnicodeDecodeError¶
Вызывается, когда во время декодирования возникает ошибка, связанная с Unicode. Это подкласс
UnicodeError
.
- exception UnicodeTranslateError¶
Вызывается, когда при переводе возникает ошибка, связанная с Юникодом. Это подкласс
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
может иметь еще один атрибут:
- 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 Development Mode отображается это предупреждение.Политика амортизации описана в разделе PEP 387.
- exception PendingDeprecationWarning¶
Базовый класс для предупреждений о функциях, которые устарели и которые, как ожидается, будут признаны устаревшими в будущем, но на данный момент не являются устаревшими.
Этот класс используется редко, поскольку выдача предупреждения о возможном предстоящем устаревании является необычной, и
DeprecationWarning
предпочтительнее для уже активных устареваний.Игнорируется фильтрами предупреждений по умолчанию. При включении параметра Python Development Mode отображается это предупреждение.
Политика амортизации описана в разделе PEP 387.
- exception SyntaxWarning¶
Базовый класс для предупреждений о сомнительном синтаксисе.
- exception RuntimeWarning¶
Базовый класс для предупреждений о сомнительном поведении во время выполнения.
- exception FutureWarning¶
Базовый класс для предупреждений об устаревших функциях, когда эти предупреждения предназначены для конечных пользователей приложений, написанных на Python.
- exception ImportWarning¶
Базовый класс для предупреждений о возможных ошибках при импорте модулей.
Игнорируется фильтрами предупреждений по умолчанию. При включении параметра Python Development Mode отображается это предупреждение.
- exception UnicodeWarning¶
Базовый класс для предупреждений, связанных с Unicode.
- exception EncodingWarning¶
Базовый класс для предупреждений, связанных с кодировками.
Более подробную информацию смотрите в разделе Предупреждение о включенном кодировании.
Добавлено в версии 3.10.
- exception ResourceWarning¶
Базовый класс для предупреждений, связанных с использованием ресурсов.
Игнорируется фильтрами предупреждений по умолчанию. При включении параметра Python Development Mode отображается это предупреждение.
Добавлено в версии 3.2.
Группы исключений¶
Следующие параметры используются, когда необходимо вызвать несколько не связанных между собой исключений. Они являются частью иерархии исключений, поэтому их можно обрабатывать с помощью except
, как и все другие исключения. Кроме того, они распознаются по except*
, который соответствует их подгруппам на основе типов содержащихся исключений.
- exception ExceptionGroup(msg, excs)¶
- exception BaseExceptionGroup(msg, excs)¶
Оба этих типа исключений содержат исключения в последовательности
excs
. Параметрmsg
должен быть строкой. Разница между этими двумя классами заключается в том, чтоBaseExceptionGroup
расширяетBaseException
и может обернуть любое исключение, в то время какExceptionGroup
расширяетException
и может обернуть только подклассыException
. Эта конструкция такова, чтоexcept Exception
перехватываетExceptionGroup
, но неBaseExceptionGroup
.Конструктор
BaseExceptionGroup
возвращает значениеExceptionGroup
, а неBaseExceptionGroup
, если все содержащиеся в нем исключения являются экземплярамиException
, поэтому его можно использовать для автоматического выбора. КонструкторExceptionGroup
, с другой стороны, создаетTypeError
, если какое-либо содержащееся в нем исключение не является подклассомException
.- message¶
msg
Аргумент конструктора. Это атрибут, доступный только для чтения.
- exceptions¶
Набор исключений в последовательности
excs
, заданной конструктору. Это атрибут, доступный только для чтения.
- subgroup(condition)¶
Возвращает группу исключений, которая содержит только исключения из текущей группы, соответствующие условию *, или
None
, если результат пуст.Условием может быть либо функция, которая принимает исключение и возвращает значение 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__()
. Например, в приведенном ниже примере определяется подкласс exception group, который принимает код 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.
Иерархия исключений¶
Иерархия классов для встроенных исключений такова: