Содержание страницы
5. Встроенные исключения¶Built-in Exceptions
В Python все исключения должны быть экземплярами класса, наследующего от BaseException. В инструкции try с блоком except, в котором указан конкретный класс, этот блок также обрабатывает любые исключения, являющиеся подклассами этого класса (но не классы исключений, от которых он наследуется). Два класса исключений, не связанные отношением наследования, никогда не эквивалентны, даже если у них одинаковые имена.
Перечисленные ниже встроенные исключения могут быть созданы интерпретатором или встроенными функциями. За исключением особо оговоренных случаев, они имеют «связанное значение», указывающее на детальную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Связанное значение обычно передаётся в качестве аргументов конструктору класса исключения.
Пользовательский код может возбуждать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке «точно так же», как если бы интерпретатор возбудил то же самое исключение; однако следует помнить, что ничто не мешает пользовательскому коду возбудить неподходящую ошибку.
Встроенные классы исключений можно наследовать для определения новых исключений; программистам рекомендуется, по крайней мере, выводить новые исключения из класса Exception, а не BaseException. Дополнительную информацию об определении исключений можно найти в учебнике Python в разделе Пользовательские исключения.
Следующие исключения в основном используются как базовые классы для других исключений.
- 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 LookupError¶
Базовый класс для исключений, которые возбуждаются, когда ключ или индекс, используемые в отображении или последовательности, недопустимы: IndexError, KeyError. Это исключение может быть возбуждено напрямую функцией codecs.lookup().
- exception EnvironmentError¶
The base class for exceptions that can occur outside the Python system: IOError, OSError. When exceptions of this type are created with a 2-tuple, the first item is available on the instance’s errno attribute (it is assumed to be an error number), and the second item is available on the strerror attribute (it is usually the associated error message). The tuple itself is also available on the args attribute.
Когда исключение EnvironmentError создаётся с кортежем из трёх элементов, первые два элемента доступны, как описано выше, а третий элемент – в атрибуте filename. Однако для обратной совместимости атрибут args содержит только кортеж из двух первых аргументов конструктора.
The filename attribute is None when this exception is created with other than 3 arguments. The errno and strerror attributes are also None when the instance was created with other than 2 or 3 arguments. In this last case, args contains the verbatim constructor arguments as a tuple.
Обычно возбуждаются следующие исключения.
- exception AttributeError¶
Возбуждается, когда обращение к атрибуту (см. Обращения к атрибутам) или присваивание атрибута завершается неудачей. (Если объект вообще не поддерживает обращение к атрибутам или их присваивание, возбуждается TypeError.)
- exception EOFError¶
Возникает, когда одна из встроенных функций (input() или raw_input()) достигает состояния конца файла (EOF), не прочитав никаких данных. (Примечание: методы file.read() и file.readline() возвращают пустую строку при достижении EOF.)
- exception FloatingPointError¶
Возбуждается при сбое операции с плавающей точкой. Это исключение определено всегда, но может быть возбуждено только если Python скомпилирован с опцией --with-fpectl, или символ WANT_SIGFPE_HANDLER определён в файле pyconfig.h.
- exception GeneratorExit¶
Возбуждается при вызове метода close() у генератора. Он напрямую наследуется от BaseException, а не от Exception, поскольку технически не является ошибкой.
- exception IOError¶
Возникает, когда операция ввода-вывода (такая как встроенные функции print() или open(), или метод объекта файла) завершается неудачей по причине, связанной с вводом-выводом, например, «файл не найден» или «диск переполнен».
Этот класс является производным от EnvironmentError. См. обсуждение выше для получения дополнительной информации об атрибутах экземпляров исключений.
- exception ImportError¶
Возбуждается, когда инструкция import не может найти определение модуля, или когда конструкция from ... import не может найти имя, которое должно быть импортировано.
- exception IndexError¶
Вызывается, когда индекс последовательности выходит за пределы диапазона. (Индексы срезов молча усекаются до допустимого диапазона; если индекс не является целым числом, вызывается TypeError.)
- exception KeyError¶
Вызывается, когда ключ отображения (словаря) не найден среди существующих ключей.
- exception KeyboardInterrupt¶
Вызывается, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно проверяется наличие прерываний. Исключение наследуется от BaseException, чтобы случайно не быть перехваченным кодом, который ловит Exception, и тем самым не помешать выходу интерпретатора.
- exception MemoryError¶
Вызывается, когда у операции заканчивается память, но ситуация всё ещё может быть исправлена (удалением некоторых объектов). Связанное значение – строка, указывающая, какая (внутренняя) операция исчерпала память. Обратите внимание, что из-за особенностей архитектуры управления памятью (функция malloc() в C) интерпретатор не всегда может полностью восстановиться после такой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, если причиной была вышедшая из-под контроля программа.
- exception NameError¶
Вызывается, когда не найдено локальное или глобальное имя. Это относится только к неквалифицированным именам. Связанное значение – сообщение об ошибке, которое включает имя, которое не удалось найти.
- exception NotImplementedError¶
Это исключение происходит от RuntimeError. В пользовательских базовых классах абстрактные методы должны вызывать это исключение, когда они требуют от производных классов переопределить метод.
- exception OSError¶
Это исключение является производным от EnvironmentError. Оно возникает, когда функция возвращает системную ошибку (не из-за недопустимых типов аргументов или других случайных ошибок). Атрибут errno содержит числовой код ошибки из errno, а атрибут strerror – соответствующую строку, какую бы вывела функция C perror(). См. модуль errno, который содержит имена кодов ошибок, определённых базовой операционной системой.
Для исключений, связанных с путём файловой системы (например, chdir() или unlink()), экземпляр исключения будет содержать третий атрибут, filename, который является именем файла, переданным функции.
- exception OverflowError¶
Возбуждается, когда результат арифметической операции слишком велик для представления. Это не может произойти для целых чисел (которые скорее возбудят MemoryError, чем сдадутся). Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой также не проверяются.
- exception ReferenceError¶
Это исключение вызывается, когда прокси слабой ссылки, созданный функцией weakref.proxy(), используется для доступа к атрибуту объекта после его сборки мусора. Для получения дополнительной информации о слабых ссылках см. модуль weakref.
- exception RuntimeError¶
Возникает, когда обнаружена ошибка, не подпадающая ни под одну из других категорий. Связанное значение – это строка, указывающая, что именно пошло не так. (Это исключение в основном является пережитком предыдущей версии интерпретатора; сейчас оно используется нечасто.)
- exception StopIteration¶
Возникает, когда встроенная функция next() или метод __next__() итератора сигнализируют об отсутствии дальнейших значений.
- 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() можно использовать, если абсолютно необходимо выйти немедленно (например, в дочернем процессе после вызова fork()).
Исключение наследуется от BaseException, а не от Exception, чтобы оно случайно не перехватывалось кодом, который ловит Exception. Это позволяет исключению правильно всплывать и приводить к завершению интерпретатора.
- exception TypeError¶
Вызывается, когда операция или функция применяется к объекту неподходящего типа. Связанное значение – строка с подробностями о несоответствии типов.
- exception UnboundLocalError¶
Возбуждается при обращении к локальной переменной в функции или методе, которой не присвоено значение. Является подклассом NameError.
- exception UnicodeError¶
Возбуждается при возникновении ошибки кодирования или декодирования, связанной с Unicode. Является подклассом ValueError.
- exception UnicodeEncodeError¶
Возникает при ошибке, связанной с Unicode, во время кодирования. Является подклассом UnicodeError.
- exception UnicodeDecodeError¶
Возникает при ошибке, связанной с Unicode, во время декодирования. Является подклассом UnicodeError.
- exception UnicodeTranslateError¶
Возникает при ошибке, связанной с Unicode, во время трансляции. Является подклассом UnicodeError.
- exception ValueError¶
Возникает, когда встроенная операция или функция получает аргумент правильного типа, но с неподходящим значением, и эта ситуация не описывается более точным исключением, например IndexError.
- exception VMSError¶
Доступно только в VMS. Возникает, когда происходит специфичная для VMS ошибка.
- exception WindowsError¶
Возникает, когда происходит специфичная для Windows ошибка или когда номер ошибки не соответствует значению errno. Значения winerror и strerror создаются из возвращаемых значений функций GetLastError() и FormatMessage() из Windows Platform API. Значение errno отображает значение winerror в соответствующие значения errno.h. Это подкласс OSError.
- exception ZeroDivisionError¶
Вызывается, когда второй аргумент операции деления или взятия остатка равен нулю. Связанное значение – строка, указывающая тип операндов и операцию.
Следующие исключения используются в качестве категорий предупреждений; подробнее см. в модуле 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.1. Иерархия исключений¶Exception hierarchy
Иерархия классов для встроенных исключений:
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EnvironmentError
| +-- IOError
| +-- OSError
| +-- WindowsError (Windows)
| +-- VMSError (VMS)
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning