Содержание страницы
5. Встроенные исключения¶Built-in Exceptions
В Python все исключения должны быть экземплярами класса, производного от BaseException. В операторе try с предложением except, в котором указан конкретный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, от которых он сам является производным). Два класса исключений, не связанных через наследование, никогда не эквивалентны, даже если они имеют одинаковые имена.
Перечисленные ниже встроенные исключения могут быть созданы интерпретатором или встроенными функциями. За исключением особо оговоренных случаев, они имеют «связанное значение», указывающее на детальную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Связанное значение обычно передаётся в качестве аргументов конструктору класса исключения.
Пользовательский код может возбуждать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке «точно так же», как если бы интерпретатор возбудил то же самое исключение; однако следует помнить, что ничто не мешает пользовательскому коду возбудить неподходящую ошибку.
Встроенные классы исключений могут быть подклассифицированы для определения новых исключений; программистам рекомендуется наследовать новые исключения от класса Exception или одного из его подклассов, а не от BaseException. Дополнительная информация об определении исключений доступна в Python Tutorial в разделе Пользовательские исключения.
При возбуждении (или повторном возбуждении) исключения в предложении except или finally __context__ автоматически устанавливается в последнее перехваченное исключение; если новое исключение не обработано, трассировка, отображаемая в конечном итоге, будет содержать исходное исключение(я) и конечное исключение.
При возбуждении нового исключения (вместо использования пустого raise для повторного возбуждения обрабатываемого в данный момент исключения) неявный контекст исключения может быть дополнен явной причиной с помощью 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.
В любом случае, само исключение всегда показывается после любых связанных исключений, так что последняя строка трассировки всегда показывает последнее возбуждённое исключение.
5.1. Базовые классы¶Base classes
Следующие исключения в основном используются как базовые классы для других исключений.
-
exception
BaseException¶ Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования пользовательскими классами (для этого используйте
Exception). Если для экземпляра этого класса вызватьstr(), возвращается строковое представление аргумента(ов) экземпляра, или пустая строка, если аргументов не было.-
args¶ Кортеж аргументов, переданных конструктору исключения. Некоторые встроенные исключения (например,
OSError) ожидают определённое количество аргументов и присваивают элементам этого кортежа специальное значение, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.
-
with_traceback(tb)¶ Этот метод устанавливает tb в качестве новой трассировки для исключения и возвращает объект исключения. Обычно используется в коде обработки исключений, например:
try: ... except SomeException: tb = sys.exc_info()[2] raise OtherException(...).with_traceback(tb)
-
-
exception
Exception¶ Все встроенные исключения, не приводящие к завершению системы, являются производными от этого класса. Все определённые пользователем исключения также должны наследоваться от этого класса.
-
exception
ArithmeticError¶ Базовый класс для встроенных исключений, которые возбуждаются при различных арифметических ошибках:
OverflowError,ZeroDivisionError,FloatingPointError.
-
exception
LookupError¶ Базовый класс для исключений, возбуждаемых, когда ключ или индекс, используемые в отображении или последовательности, недействительны:
IndexError,KeyError. Оно может быть возбуждено напрямую с помощьюcodecs.lookup().
5.2. Конкретные исключения¶Concrete exceptions
Обычно возбуждаются следующие исключения.
-
exception
AttributeError¶ Возбуждается при неудачном обращении к атрибуту (см. Обращения к атрибутам) или присваивании. (Если объект вообще не поддерживает обращения к атрибутам или их присваивание, возбуждается
TypeError.)
-
exception
EOFError¶ Возникает, когда функция
input()достигает конца файла (EOF), не прочитав ни одного байта. (Прим.: методыio.IOBase.read()иio.IOBase.readline()возвращают пустую строку при достижении EOF.)
-
exception
FloatingPointError¶ Возникает при ошибке операции с плавающей запятой. Это исключение всегда определено, но может быть вызвано только при сборке Python с опцией
--with-fpectl, или если символWANT_SIGFPE_HANDLERопределён в файлеpyconfig.h.
-
exception
GeneratorExit¶ Возбуждается при закрытии генератора или корутины; см.
generator.close()иcoroutine.close(). Это исключение напрямую наследуется отBaseException, а не отException, поскольку технически не является ошибкой.
-
exception
ImportError¶ Возбуждается, когда оператор
importиспытывает проблемы при попытке загрузить модуль. Также возбуждается, когда «список from» вfrom ... importсодержит имя, которое не удаётся найти.Атрибуты
nameиpathможно задать с помощью аргументов, передаваемых только по ключевому слову конструктору. После установки они представляют имя модуля, который пытались импортировать, и путь к файлу, вызвавшему исключение, соответственно.Изменено в версии 3.3: Добавлены атрибуты
nameиpath.
-
exception
ModuleNotFoundError¶ Подкласс
ImportError, который вызываетсяimport, когда модуль не может быть найден. Также вызывается, когдаNoneобнаружен вsys.modules.Новое в версии 3.6.
-
exception
IndexError¶ Вызывается, когда индекс последовательности выходит за диапазон. (Индексы среза молча обрезаются, чтобы попасть в допустимый диапазон; если индекс не является целым числом, вызывается
TypeError.)
-
exception
KeyError¶ Вызывается, когда ключ отображения (словаря) не найден среди существующих ключей.
-
exception
KeyboardInterrupt¶ Возникает, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно проверяется наличие прерывания. Исключение наследуется от
BaseException, чтобы его случайно не перехватил код, который ловитException, и тем самым не заблокировал завершение интерпретатора.
-
exception
MemoryError¶ Вызывается, когда операция исчерпывает память, но ситуацию ещё можно исправить (удалив некоторые объекты). Связанное значение – строка, указывающая, какая (внутренняя) операция исчерпала память. Обратите внимание, что из-за лежащей в основе архитектуры управления памятью (функция C
malloc()) интерпретатор не всегда может полностью восстановиться после этой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, если причиной была вышедшая из-под контроля программа.
-
exception
NameError¶ Вызывается, когда не найдено локальное или глобальное имя. Это относится только к неквалифицированным именам. Связанное значение – сообщение об ошибке, которое включает имя, которое не удалось найти.
-
exception
NotImplementedError¶ Это исключение является производным от
RuntimeError. В определённых пользователями базовых классах абстрактные методы должны вызывать это исключение, когда они требуют, чтобы производные классы переопределили метод, или пока класс находится в разработке, чтобы указать, что реальная реализация ещё не добавлена.Примечание
Он не должен использоваться для указания того, что оператор или метод не предназначен для поддержки вообще – в этом случае либо оставьте оператор/метод неопределённым, либо, если это подкласс, установите его в
None.Примечание
NotImplementedErrorиNotImplementedне являются взаимозаменяемыми, хотя у них похожие названия и назначение. СмотритеNotImplemented, чтобы узнать, когда их использовать.
-
exception
OSError([arg])¶ -
exception
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, который передаётся в качестве аргумента при создании исключения и по умолчанию равенNone.Когда генератор или корутина возвращает, возбуждается новый экземпляр
StopIteration, и возвращённое функцией значение используется как параметрvalueконструктора исключения.Если функция-генератор, определённая при наличии директивы
from __future__ import generator_stop, возбуждаетStopIteration, она будет преобразована вRuntimeError(с сохранениемStopIterationв качестве причины нового исключения).Изменено в версии 3.3: Добавлен атрибут
valueи возможность для функций-генераторов использовать его для возврата значения.Изменено в версии 3.5: Введено преобразование в RuntimeError.
-
exception
StopAsyncIteration¶ Должно быть возбуждено методом
__anext__()объекта асинхронный итератор, чтобы остановить итерацию.Новое в версии 3.5.
-
exception
SyntaxError¶ Возбуждается, когда синтаксический анализатор обнаруживает синтаксическую ошибку. Это может произойти в операторе
import, при вызове встроенных функцийexec()илиeval(), или при чтении исходного скрипта или стандартного ввода (также в интерактивном режиме).Экземпляры этого класса имеют атрибуты
filename,lineno,offsetиtextдля упрощения доступа к подробностям.str()экземпляра исключения возвращает только сообщение.
-
exception
IndentationError¶ Базовый класс для синтаксических ошибок, связанных с неверным отступом. Является подклассом
SyntaxError.
-
exception
TabError¶ Возбуждается, когда отступ содержит непоследовательное использование табуляции и пробелов. Является подклассом
IndentationError.
-
exception
SystemError¶ Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не настолько серьезна, чтобы заставить его отказаться от всех надежд. Связанное значение представляет собой строку, указывающую на то, что пошло не так (на низкоуровневом языке).
Об этом следует сообщить автору или сопровождающему вашего интерпретатора Python. Обязательно укажите версию интерпретатора Python (
sys.version; она также выводится в начале интерактивного сеанса Python), точное сообщение об ошибке (связанное значение исключения) и, если возможно, исходный код программы, вызвавшей ошибку.
-
exception
SystemExit¶ Это исключение возбуждается функцией
sys.exit(). Оно наследуется отBaseException, а не отException, чтобы его случайно не перехватил код, который перехватываетException. Это позволяет исключению правильно всплыть и вызвать завершение интерпретатора. Если оно не обработано, интерпретатор Python завершается; стек вызовов не выводится. Конструктор принимает тот же необязательный аргумент, что иsys.exit(). Если значение – целое число, оно задаёт статус выхода системы (передаётся функцииexit()в C); если этоNone, статус выхода равен нулю; если имеет другой тип (например, строку), значение объекта выводится, а статус выхода равен единице.Вызов
sys.exit()преобразуется в исключение, чтобы могли выполниться обработчики очистки (блокиfinallyоператоровtry), а также чтобы отладчик мог выполнить скрипт без риска потерять управление. Функциюos._exit()можно использовать, если абсолютно необходимо выйти немедленно (например, в дочернем процессе после вызоваos.fork()).-
code¶ Код возврата или сообщение об ошибке, передаваемые в конструктор. (По умолчанию
None.)
-
-
exception
TypeError¶ Вызывается, когда операция или функция применяется к объекту неподходящего типа. Связанное значение – строка с подробностями о несоответствии типов.
Это исключение может вызываться пользовательским кодом, чтобы указать, что попытка выполнить операцию над объектом не поддерживается и не предполагается. Если объект должен поддерживать данную операцию, но ещё не имеет реализации, правильным исключением будет
NotImplementedError.Передача аргументов неправильного типа (например, передача
list, когда ожидаетсяint) должна приводить кTypeError, а передача аргументов с неправильным значением (например, число вне допустимых границ) должна приводить кValueError.
-
exception
UnboundLocalError¶ Вызывается, когда осуществляется обращение к локальной переменной функции или метода, но этой переменной не присвоено значение. Является подклассом
NameError.
-
exception
UnicodeError¶ Вызывается при ошибке кодирования или декодирования, связанной с Unicode. Является подклассом
ValueError.UnicodeErrorимеет атрибуты, описывающие ошибку кодирования или декодирования. Например,err.object[err.start:err.end]содержит конкретные недопустимые входные данные, на которых споткнулся кодек.-
encoding¶ Имя кодировки, вызвавшей ошибку.
-
reason¶ Строка, описывающая конкретную ошибку кодека.
-
object¶ Объект, который кодек пытался закодировать или декодировать.
-
-
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.
5.2.1. Исключения ОС¶OS exceptions
Следующие исключения являются подклассами OSError; они возбуждаются в зависимости от кода системной ошибки.
-
exception
BlockingIOError¶ Возбуждается, когда операция заблокировалась бы на объекте (например, сокете), настроенном на неблокирующий режим. Соответствует
errnoEAGAIN,EALREADY,EWOULDBLOCKиEINPROGRESS.В дополнение к атрибутам
OSError,BlockingIOErrorможет иметь ещё один атрибут:
-
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()) запрашивается для объекта, который не является каталогом. СоответствуетerrnoENOTDIR.
-
exception
PermissionError¶ Возникает при попытке выполнить операцию без достаточных прав доступа – например, прав файловой системы. Соответствует
errno,EACCESиEPERM.
-
exception
ProcessLookupError¶ Возбуждается, когда указанный процесс не существует. Соответствует
errnoESRCH.
-
exception
TimeoutError¶ Возбуждается, когда системная функция превысила время ожидания на уровне системы. Соответствует
errnoETIMEDOUT.
Новое в версии 3.3: Все вышеуказанные подклассы OSError были добавлены.
См. также
PEP 3151 – Переработка иерархии исключений ОС и ввода-вывода
5.3. Предупреждения¶Warnings
Следующие исключения используются как категории предупреждений; дополнительную информацию см. в модуле warnings
.
-
exception
Warning¶ Базовый класс для категорий предупреждений.
-
exception
UserWarning¶ Базовый класс для предупреждений, генерируемых пользовательским кодом.
-
exception
DeprecationWarning¶ Базовый класс для предупреждений об устаревших возможностях.
-
exception
PendingDeprecationWarning¶ Базовый класс для предупреждений о возможностях, которые будут признаны устаревшими в будущем.
-
exception
SyntaxWarning¶ Базовый класс для предупреждений о сомнительном синтаксисе.
-
exception
RuntimeWarning¶ Базовый класс для предупреждений о сомнительном поведении во время выполнения.
-
exception
FutureWarning¶ Базовый класс для предупреждений о конструкциях, которые в будущем изменят семантику.
-
exception
ImportWarning¶ Базовый класс для предупреждений о возможных ошибках при импорте модулей.
-
exception
UnicodeWarning¶ Базовый класс для предупреждений, связанных с Unicode.
-
exception
ResourceWarning¶ Базовый класс для предупреждений, связанных с использованием ресурсов.
Новое в версии 3.2.
5.4. Иерархия исключений¶Exception hierarchy
Иерархия классов для встроенных исключений:
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- 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
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning