5. Встроенные исключения
В Python все исключения должны быть экземплярами класса, производного от
BaseException. В операторе try с предложением except,
указывающим конкретный класс, это предложение также обрабатывает любые классы
исключений, производные от этого класса (но не классы исключений, от которых
он сам является производным). Два класса исключений, не связанные
отношением наследования, никогда не являются эквивалентными, даже если они имеют
одинаковые имена.
Встроенные исключения, перечисленные ниже, могут быть порождены интерпретатором или встроенными функциями. Если не указано иное, они имеют «связанное значение», указывающее на детальную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, объясняющая код). Связанное значение обычно передаётся в качестве аргументов конструктору класса исключения.
Пользовательский код может возбуждать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке «точно так же», как это делает интерпретатор; однако следует помнить, что ничто не мешает пользовательскому коду возбудить неподходящее исключение.
Встроенные классы исключений можно наследовать, чтобы определить новые
исключения; программистам рекомендуется создавать новые исключения от класса
Exception или одного из его подклассов, а не от BaseException. Дополнительную
информацию об определении исключений можно найти в руководстве Python в разделе
Пользовательские исключения.
При возбуждении (или повторном возбуждении) исключения в предложении 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. Базовые классы
Следующие исключения в основном используются как базовые классы для других исключений.
-
exception
BaseException¶ Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования пользовательскими классами (для этого используйте
Exception). Если для экземпляра этого класса вызванstr(), возвращается представление аргумента(ов) экземпляра или пустая строка, если аргументов не было.-
args¶ Кортеж аргументов, переданных конструктору исключения. Некоторые встроенные исключения (например,
OSError) ожидают определённое количество аргументов и придают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.
-
with_traceback(tb)¶ Этот метод устанавливает tb в качестве новой трассировки для исключения и возвращает объект исключения. Обычно используется в коде обработки исключений, например так:
pythontry: ... 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. Конкретные исключения
Следующие исключения – это исключения, которые обычно возбуждаются.
-
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 list» в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¶ Возникает, когда операции не хватает памяти, но ситуацию всё ещё можно исправить (удалив некоторые объекты). Связанное значение – строка, указывающая, какому (внутреннему) типу операции не хватило памяти. Обратите внимание, что из-за лежащей в основе архитектуры управления памятью (функция
malloc()языка C) интерпретатор не всегда может полностью восстановиться после этой ситуации; тем не менее он вызывает исключение, чтобы можно было вывести трассировку стека, на случай если причиной была вышедшая из-под контроля программа.
-
exception
NameError¶ Возникает, когда локальное или глобальное имя не найдено. Это относится только к неквалифицированным именам. Связанное значение – сообщение об ошибке, содержащее имя, которое не удалось найти.
-
exception
NotImplementedError¶ Это исключение наследуется от
RuntimeError. В пользовательских базовых классах абстрактные методы должны вызывать это исключение, если они требуют переопределения метода в производных классах, или во время разработки класса, чтобы указать, что настоящая реализация ещё должна быть добавлена.Примечание
Его не следует использовать для указания того, что оператор или метод вообще не предназначен для поддержки – в этом случае либо оставьте оператор/метод неопределённым, либо, если это подкласс, установите его в
None.Примечание
NotImplementedErrorиNotImplementedне взаимозаменяемы, даже несмотря на схожие названия и назначение. Подробнее о том, когда их использовать, см. вNotImplemented.
-
exception
OSError([arg])¶ -
exception
OSError(errno, strerror[, filename[, winerror[, filename2]]]) Это исключение порождается, когда системная функция возвращает системную ошибку, включая ошибки ввода-вывода, такие как «файл не найден» или «диск полон» (но не для недопустимых типов аргументов или других случайных ошибок).
Вторая форма конструктора устанавливает соответствующие атрибуты (описаны ниже). Если атрибуты не указаны, они по умолчанию равны
None. Для обратной совместимости, при передаче трёх аргументов атрибутargsсодержит только 2-кортеж из первых двух аргументов конструктора.Конструктор часто на самом деле возвращает подкласс
OSError, как описано в разделе Исключения ОС ниже. Конкретный подкласс зависит от конечного значенияerrno. Это поведение происходит только при созданииOSErrorнапрямую или через псевдоним и не наследуется при создании подклассов.-
errno¶ Числовой код ошибки из переменной
errno(C).
-
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. Исключения ОС
Следующие исключения являются подклассами OSError; они возникают в зависимости от системного кода ошибки.
-
exception
BlockingIOError¶ Возникает, когда операция привела бы к блокировке объекта (например, сокета), установленного в неблокирующий режим. Соответствует
errnoEAGAIN,EALREADY,EWOULDBLOCKиEINPROGRESS.В дополнение к атрибутам
OSError,BlockingIOErrorможет иметь ещё один атрибут:
-
exception
ChildProcessError¶ Возникает, когда операция над дочерним процессом завершилась неудачей. Соответствует
errnoECHILD.
-
exception
ConnectionError¶ Базовый класс для проблем, связанных с соединением.
Подклассами являются
BrokenPipeError,ConnectionAbortedError,ConnectionRefusedErrorиConnectionResetError.
-
exception
BrokenPipeError¶ Подкласс
ConnectionError, возбуждаемый при попытке записи в канал, когда другой конец закрыт, или при попытке записи в сокет, который был закрыт для записи. Соответствуетerrno,EPIPEи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.
-
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. Иерархия исключений
Иерархия классов для встроенных исключений:
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