Встроенные исключения
В 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__ложно.В любом случае, само исключение всегда отображается после любых цепочных исключений, так что последняя строка трассировки всегда показывает последнее поднятое исключение.
Наследование от встроенных исключений
Пользовательский код может создавать подклассы, наследующие от типа исключения. Рекомендуется наследовать только от одного типа исключения за раз, чтобы избежать возможных конфликтов в том, как базовые классы обрабатывают атрибут 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]) - исключение OSError(errno, strerror[, filename[, winerror[, filename2]]])
-
Это исключение возникает, когда системная функция возвращает системную ошибку, включая ошибки ввода-вывода, такие как «файл не найден» или «диск заполнен» (не для типов аргументов, нарушающих правила, или других случайных ошибок).
Во втором варианте конструктора устанавливаются соответствующие атрибуты, описанные ниже. Атрибуты по умолчанию равны
None, если не указаны. Для обеспечения обратной совместимости, если передано три аргумента, атрибутargsсодержит только кортеж из двух первых аргументов конструктора.Конструктор часто фактически возвращает подкласс
OSError, как описано в разделе «Системные исключения» ниже. Конкретный подкласс зависит от конечного значенияerrno. Это поведение наблюдается только при прямом создании объектаOSErrorили через псевдоним, и не наследуется при наследовании.-
errno -
Числовой код ошибки из C-переменной
errno.
-
winerror -
В Windows это даёт вам собственный код ошибки Windows. Атрибут
errnoзатем представляет собой приблизительный перевод этого кода ошибки в терминах POSIX.В Windows, если аргумент конструктора winerror — целое число, атрибут
errnoопределяется из кода ошибки Windows, а аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, и атрибутwinerrorне существует.
-
strerror -
Соответствующее сообщение об ошибке, предоставленное операционной системой. Оно форматируется функциями 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теперь содержит исходное имя файла, переданное в функцию, вместо имени, закодированного или декодированного в кодировку/обработчик ошибок файловой системы. Также был добавлен аргумент и атрибут конструктора 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 -
Вызывается, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не выглядит настолько серьёзной, чтобы заставлять его терять надежду. Соответствующее значение — строка, описывающая, что пошло не так (в низкоуровневом представлении).
Вы должны сообщить об этом автору или разработчику вашей 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.
Исключения OS
Следующие исключения являются подклассами 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 — Переработка иерархии исключений OS и IO
Предупреждения
Следующие исключения используются в качестве категорий предупреждений; см. документацию Категории предупреждений для получения более подробной информации.
-
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 -
Базовый класс для предупреждений, связанных с кодировками.
См. Включение предупреждения 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— результат, соответствующий условию, и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