Документация Python неофициальный перевод
Содержание страницы

5. Встроенные исключенияBuilt-in Exceptions

В Python все исключения должны быть экземплярами класса, наследующего от BaseException. В инструкции try с блоком except, в котором указан конкретный класс, этот блок также обрабатывает любые исключения, являющиеся подклассами этого класса (но не классы исключений, от которых он наследуется). Два класса исключений, не связанные отношением наследования, никогда не эквивалентны, даже если у них одинаковые имена.

Перечисленные ниже встроенные исключения могут быть созданы интерпретатором или встроенными функциями. За исключением особо оговоренных случаев, они имеют «связанное значение», указывающее на детальную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Связанное значение обычно передаётся в качестве аргументов конструктору класса исключения.

Пользовательский код может возбуждать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке «точно так же», как если бы интерпретатор возбудил то же самое исключение; однако следует помнить, что ничто не мешает пользовательскому коду возбудить неподходящую ошибку.

Встроенные классы исключений можно наследовать для определения новых исключений; программистам рекомендуется, по крайней мере, выводить новые исключения из класса Exception, а не BaseException. Дополнительную информацию об определении исключений можно найти в учебнике Python в разделе Пользовательские исключения.

При возбуждении (или повторном возбуждении) исключения в предложении except __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

Кортеж аргументов, переданных конструктору исключения. Некоторые встроенные исключения (например, IOError) ожидают определённое количество аргументов и придают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.

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 BufferError

Возбуждается, когда не может быть выполнена операция, связанная с буфером.

exception LookupError

Базовый класс для исключений, которые возбуждаются, когда ключ или индекс, используемые в отображении или последовательности, недопустимы: IndexError, KeyError. Это исключение может быть возбуждено напрямую функцией codecs.lookup().

5.2. Конкретные исключенияConcrete exceptions

Обычно возбуждаются следующие исключения.

exception AssertionError

Возбуждается, когда инструкция assert завершается неудачей.

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

Возбуждается при вызове метода close() у генератора. Он напрямую наследуется от BaseException, а не от Exception, поскольку технически не является ошибкой.

exception ImportError

Возбуждается, когда инструкция import не может найти определение модуля, или когда конструкция from ... import не может найти имя, которое должно быть импортировано.

Атрибуты name и path можно установить с помощью аргументов, передаваемых только по ключу, конструктору. При установке они представляют собой имя модуля, который пытались импортировать, и путь к файлу, вызвавшему исключение, соответственно.

Изменено в версии 3.3: Добавлены атрибуты name и path.

exception IndexError

Вызывается, когда индекс последовательности выходит за пределы диапазона. (Индексы срезов молча усекаются до допустимого диапазона; если индекс не является целым числом, вызывается TypeError.)

exception KeyError

Вызывается, когда ключ отображения (словаря) не найден среди существующих ключей.

exception KeyboardInterrupt

Вызывается, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно проверяется наличие прерываний. Исключение наследуется от BaseException, чтобы случайно не быть перехваченным кодом, который ловит Exception, и тем самым не помешать выходу интерпретатора.

exception MemoryError

Вызывается, когда у операции заканчивается память, но ситуация всё ещё может быть исправлена (удалением некоторых объектов). Связанное значение – строка, указывающая, какая (внутренняя) операция исчерпала память. Обратите внимание, что из-за особенностей архитектуры управления памятью (функция malloc() в C) интерпретатор не всегда может полностью восстановиться после такой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, если причиной была вышедшая из-под контроля программа.

exception NameError

Вызывается, когда не найдено локальное или глобальное имя. Это относится только к неквалифицированным именам. Связанное значение – сообщение об ошибке, которое включает имя, которое не удалось найти.

exception NotImplementedError

Это исключение происходит от RuntimeError. В пользовательских базовых классах абстрактные методы должны вызывать это исключение, когда они требуют от производных классов переопределить метод.

exception OSError

Это исключение возбуждается, когда системная функция возвращает системную ошибку, включая ошибки ввода-вывода, такие как «файл не найден» или «диск переполнен» (не для недопустимых типов аргументов или других случайных ошибок). Часто на самом деле возбуждается подкласс OSError, как описано в системных исключениях OSError ниже. Атрибут errno представляет собой числовой код ошибки из переменной C errno.

В Windows атрибут winerror предоставляет собственный код ошибки Windows. Атрибут errno затем является приблизительным переводом этого собственного кода ошибки в терминах POSIX.

На всех платформах атрибут strerror является соответствующим сообщением об ошибке, предоставляемым операционной системой (в том виде, в каком он форматируется функциями C perror() в POSIX и FormatMessage() в Windows).

Для исключений, связанных с путём файловой системы (например, open() или os.unlink()), экземпляр исключения будет содержать дополнительный атрибут filename, который представляет собой имя файла, переданное функции.

Изменено в версии 3.3: EnvironmentError, IOError, WindowsError, VMSError, socket.error, select.error и mmap.error были объединены в OSError.

exception OverflowError

Возбуждается, когда результат арифметической операции слишком велик для представления. Это не может произойти для целых чисел (которые скорее возбудят MemoryError, чем сдадутся). Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой также не проверяются.

exception ReferenceError

Это исключение вызывается, когда прокси слабой ссылки, созданный функцией weakref.proxy(), используется для доступа к атрибуту объекта после его сборки мусора. Для получения дополнительной информации о слабых ссылках см. модуль weakref.

exception RuntimeError

Возникает, когда обнаружена ошибка, не попадающая ни в одну из других категорий. Связанное значение – строка, указывающая, что именно пошло не так.

exception StopIteration

Возбуждается встроенной функцией next() и методом итератора __next__(), чтобы указать, что итератор больше не выдаёт элементов.

Объект исключения имеет единственный атрибут value, который передаётся как аргумент при создании исключения и по умолчанию равен None.

Когда генераторная функция возвращает значение, возбуждается новый экземпляр StopIteration, и возвращённое функцией значение используется в качестве параметра value конструктора исключения.

Изменено в версии 3.3: Добавлен атрибут value и возможность для генераторных функций использовать его для возврата значения.

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(). Если оно не обработано, интерпретатор Python завершает работу; трассировка стека не выводится. Если связанное значение является целым числом, оно задаёт статус выхода системы (передаётся функции C exit()); если это None, статус выхода равен нулю; если оно имеет другой тип (например, строку), значение объекта выводится, а статус выхода равен единице.

Экземпляры имеют атрибут code, который устанавливается в предлагаемый статус выхода или сообщение об ошибке (по умолчанию None). Кроме того, это исключение наследуется напрямую от BaseException, а не от Exception, поскольку технически не является ошибкой.

Вызов sys.exit() преобразуется в исключение, чтобы могли выполниться обработчики очистки (блоки finally операторов try) и чтобы отладчик мог выполнять скрипт без риска потери управления. Функцию os._exit() можно использовать, если абсолютно необходимо немедленно завершиться (например, в дочернем процессе после вызова os.fork()).

Исключение наследуется от BaseException, а не от Exception, чтобы оно случайно не перехватывалось кодом, который ловит Exception. Это позволяет исключению правильно всплывать и приводить к завершению интерпретатора.

exception TypeError

Вызывается, когда операция или функция применяется к объекту неподходящего типа. Связанное значение – строка с подробностями о несоответствии типов.

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 VMSError

Доступно только на VMS.

exception WindowsError

Доступно только в Windows.

5.2.1. Исключения ОСOS exceptions

Следующие исключения являются подклассами OSError; они возбуждаются в зависимости от системного кода ошибки.

exception BlockingIOError

Возникает, когда операция должна была бы заблокироваться на объекте (например, сокете), настроенном на неблокирующий режим. Соответствует errno EAGAIN, EALREADY, EWOULDBLOCK и EINPROGRESS.

В дополнение к атрибутам OSError, BlockingIOError может иметь ещё один атрибут:

characters_written

Целое число, содержащее количество символов, записанных в поток данных до блокировки. Этот атрибут доступен при использовании буферизованных классов ввода-вывода из модуля io.

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

A subclass of ConnectionError, raised when a connection is reset by the peer. Corresponds to errno ECONNRESET.

exception FileExistsError

Возникает при попытке создать файл или каталог, который уже существует. Соответствует errno EEXIST.

exception FileNotFoundError

Возникает при запросе файла или каталога, которого не существует. Соответствует errno ENOENT.

exception InterruptedError

Возникает, когда системный вызов прерван входящим сигналом. Соответствует errno EINTR.

exception IsADirectoryError

Возникает, когда файловая операция (например, os.remove()) запрошена для каталога. Соответствует errno EISDIR.

exception NotADirectoryError

Возникает, когда операция с каталогом (например, os.listdir()) запрошена для объекта, который не является каталогом. Соответствует errno ENOTDIR.

exception PermissionError

Возникает при попытке выполнить операцию без достаточных прав доступа – например, прав файловой системы. Соответствует errno EACCES и EPERM.

exception ProcessLookupError

Возникает, когда указанный процесс не существует. Соответствует errno ESRCH.

exception TimeoutError

Возникает, когда системная функция превысила время ожидания на системном уровне. Соответствует errno ETIMEDOUT.

Новое в версии 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 BytesWarning

Базовый класс для предупреждений, связанных с bytes и bytearray.

exception ResourceWarning

Базовый класс для предупреждений, связанных с использованием ресурсов.

Новое в версии 3.2.

5.4. Иерархия исключенийException hierarchy

Иерархия классов для встроенных исключений:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      +-- 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
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning