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

exceptions.md

526 строк · 31.1 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/exceptions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6. Встроенные исключения89В Python все исключения должны быть экземплярами класса, наследующего от [`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException). В инструкции [`try`](https://python-all.ru/3.1/reference/compound_stmts.html#try) с блоком [`except`](https://python-all.ru/3.1/reference/compound_stmts.html#except), в котором указан конкретный класс, этот блок также обрабатывает любые исключения, являющиеся подклассами этого класса (но не классы исключений, от которых *он* наследуется). Два класса исключений, не связанные отношением наследования, никогда не эквивалентны, даже если у них одинаковые имена.1011Перечисленные ниже встроенные исключения могут быть созданы интерпретатором или встроенными функциями. За исключением особо оговоренных случаев, они имеют «связанное значение», указывающее на детальную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Связанное значение обычно передаётся в качестве аргументов конструктору класса исключения.1213Пользовательский код может возбуждать встроенные исключения. Это можно использовать для проверки обработчика исключений или для сообщения об ошибке «точно так же», как если бы интерпретатор возбудил то же самое исключение; однако следует помнить, что ничто не мешает пользовательскому коду возбудить неподходящую ошибку.1415Встроенные классы исключений можно наследовать для определения новых исключений; программистам рекомендуется, по крайней мере, выводить новые исключения из класса [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception), а не [`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException). Дополнительную информацию об определении исключений можно найти в учебнике Python в разделе [*Пользовательские исключения*](https://python-all.ru/3.1/tutorial/errors.html#tut-userexceptions).1617Следующие исключения в основном используются как базовые классы для других исключений.1819#### `exception BaseException`2021Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования пользовательскими классами (для этого используйте [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception)). Если вызвать [`bytes()`](https://python-all.ru/3.1/library/functions.html#bytes) или [`str()`](https://python-all.ru/3.1/library/functions.html#str) для экземпляра этого класса, возвращается строковое представление переданных ему аргументов, или пустая строка, если аргументов не было.2223#### `args`2425Кортеж аргументов, переданных конструктору исключения. Некоторые встроенные исключения (например,2627[`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError)2829) ожидают определённое количество аргументов и придают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.3031#### `with_traceback(tb)`3233Этот метод устанавливает *tb* в качестве новой трассировки для исключения и возвращает объект исключения. Обычно используется в коде обработки исключений, например:3435```python36try:37    ...38except SomeException:39    tb = sys.exc_info()[2]40    raise OtherException(...).with_traceback(tb)41```4243#### `exception Exception`4445Все встроенные исключения, не приводящие к завершению системы, являются производными от этого класса. Все определённые пользователем исключения также должны наследоваться от этого класса.4647#### `exception ArithmeticError`4849Базовый класс для тех встроенных исключений, которые возбуждаются при различных арифметических ошибках:5051[`OverflowError`](https://python-all.ru/3.1/library/exceptions.html#OverflowError)5253,5455[`ZeroDivisionError`](https://python-all.ru/3.1/library/exceptions.html#ZeroDivisionError)5657,5859[`FloatingPointError`](https://python-all.ru/3.1/library/exceptions.html#FloatingPointError)6061.6263#### `exception BufferError`6465Возбуждается, когда не может быть выполнена операция, связанная с6667[*буфером*](https://python-all.ru/3.1/c-api/buffer.html#bufferobjects)6869.7071#### `exception LookupError`7273Базовый класс для исключений, которые возбуждаются, когда ключ или индекс, используемые в отображении или последовательности, недопустимы:7475[`IndexError`](https://python-all.ru/3.1/library/exceptions.html#IndexError)7677,7879[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)8081. Это исключение может быть возбуждено напрямую функцией8283[`codecs.lookup()`](https://python-all.ru/3.1/library/codecs.html#codecs.lookup)8485.8687#### `exception EnvironmentError`8889Базовый класс для исключений, которые могут возникать вне системы Python: [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError), [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError). Когда исключения этого типа создаются с кортежем из 2 элементов, первый элемент доступен через атрибут `errno` экземпляра (предполагается, что это номер ошибки), а второй элемент – через атрибут `strerror` (обычно это соответствующее сообщение об ошибке). Сам кортеж также доступен через атрибут `args`.9091Когда исключение [`EnvironmentError`](https://python-all.ru/3.1/library/exceptions.html#EnvironmentError) создаётся с кортежем из трёх элементов, первые два элемента доступны, как описано выше, а третий элемент – в атрибуте `filename`. Однако для обратной совместимости атрибут `args` содержит только кортеж из двух первых аргументов конструктора.9293Атрибут `filename` равен `None`, когда это исключение создано с количеством аргументов, отличным от 3. Атрибуты `errno` и `strerror` также равны `None`, когда экземпляр был создан с количеством аргументов, отличным от 2 или 3. В последнем случае `args` содержит аргументы конструктора как есть в виде кортежа.9495Обычно возбуждаются следующие исключения.9697#### `exception AssertionError`9899Возбуждается, когда инструкция [`assert`](https://python-all.ru/3.1/reference/simple_stmts.html#assert) завершается неудачей.100101#### `exception AttributeError`102103Возбуждается, когда обращение к атрибуту (см.104105[*Обращения к атрибутам*](https://python-all.ru/3.1/reference/expressions.html#attribute-references)106107) или присваивание атрибута завершается неудачей. (Если объект вообще не поддерживает обращение к атрибутам или их присваивание, возбуждается108109[`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError)110111.)112113#### `exception EOFError`114115Возникает, когда одна из встроенных функций (116117[`input()`](https://python-all.ru/3.1/library/functions.html#input)118119или120121`raw_input()`122123) достигает состояния конца файла (EOF), не прочитав никаких данных. (Примечание: методы124125`file.read()`126127и128129`file.readline()`130131возвращают пустую строку при достижении EOF.)132133#### `exception FloatingPointError`134135Возбуждается при сбое операции с плавающей точкой. Это исключение определено всегда, но может быть возбуждено только если Python скомпилирован с опцией136137`--with-fpectl`138139, или символ140141`WANT_SIGFPE_HANDLER`142143определён в файле144145`pyconfig.h`146147.148149#### `exception GeneratorExit`150151Возбуждается при вызове метода152153`close()`154155у156157[*генератора*](https://python-all.ru/3.1/glossary.html#term-generator)158159. Он напрямую наследуется от160161[`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException)162163, а не от164165[`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception)166167, поскольку технически не является ошибкой.168169#### `exception IOError`170171Возникает, когда операция ввода-вывода (такая как встроенные функции [`print()`](https://python-all.ru/3.1/library/functions.html#print) или [`open()`](https://python-all.ru/3.1/library/functions.html#open), или метод [*объекта файла*](https://python-all.ru/3.1/glossary.html#term-file-object)) завершается неудачей по причине, связанной с вводом-выводом, например, «файл не найден» или «диск переполнен».172173Этот класс является производным от [`EnvironmentError`](https://python-all.ru/3.1/library/exceptions.html#EnvironmentError). См. обсуждение выше для получения дополнительной информации об атрибутах экземпляров исключений.174175#### `exception ImportError`176177Возбуждается, когда инструкция178179[`import`](https://python-all.ru/3.1/reference/simple_stmts.html#import)180181не может найти определение модуля, или когда конструкция182183`from ... import`184185не может найти имя, которое должно быть импортировано.186187#### `exception IndexError`188189Вызывается, когда индекс последовательности выходит за пределы диапазона. (Индексы срезов молча усекаются до допустимого диапазона; если индекс не является целым числом, вызывается190191[`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError)192193.)194195#### `exception KeyError`196197Вызывается, когда ключ отображения (словаря) не найден среди существующих ключей.198199#### `exception KeyboardInterrupt`200201Вызывается, когда пользователь нажимает клавишу прерывания (обычно202203`Control-C`204205или206207`Delete`208209). Во время выполнения регулярно проверяется наличие прерываний. Исключение наследуется от210211[`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException)212213, чтобы случайно не быть перехваченным кодом, который ловит214215[`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception)216217, и тем самым не помешать выходу интерпретатора.218219#### `exception MemoryError`220221Вызывается, когда у операции заканчивается память, но ситуация всё ещё может быть исправлена (удалением некоторых объектов). Связанное значение – строка, указывающая, какая (внутренняя) операция исчерпала память. Обратите внимание, что из-за особенностей архитектуры управления памятью (функция222223`malloc()`224225в C) интерпретатор не всегда может полностью восстановиться после такой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, если причиной была вышедшая из-под контроля программа.226227#### `exception NameError`228229Вызывается, когда не найдено локальное или глобальное имя. Это относится только к неквалифицированным именам. Связанное значение – сообщение об ошибке, которое включает имя, которое не удалось найти.230231#### `exception NotImplementedError`232233Это исключение происходит от234235[`RuntimeError`](https://python-all.ru/3.1/library/exceptions.html#RuntimeError)236237. В пользовательских базовых классах абстрактные методы должны вызывать это исключение, когда они требуют от производных классов переопределить метод.238239#### `exception OSError`240241Это исключение является производным от [`EnvironmentError`](https://python-all.ru/3.1/library/exceptions.html#EnvironmentError). Оно возбуждается, когда функция возвращает системную ошибку (не для недопустимых типов аргументов или других случайных ошибок). Атрибут `errno` – это числовой код ошибки из `errno`, а атрибут `strerror` – соответствующая строка, как она была бы выведена функцией C `perror()`. См. модуль [`errno`](https://python-all.ru/3.1/library/errno.html#module-errno), который содержит имена кодов ошибок, определенных базовой операционной системой.242243Для исключений, связанных с путём файловой системы (например, `chdir()` или `unlink()`), экземпляр исключения будет содержать третий атрибут, `filename`, который является именем файла, переданным функции.244245#### `exception OverflowError`246247Возбуждается, когда результат арифметической операции слишком велик для представления. Это не может произойти для целых чисел (которые скорее возбудят248249[`MemoryError`](https://python-all.ru/3.1/library/exceptions.html#MemoryError)250251, чем сдадутся). Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой также не проверяются.252253#### `exception ReferenceError`254255Это исключение вызывается, когда прокси слабой ссылки, созданный функцией256257[`weakref.proxy()`](https://python-all.ru/3.1/library/weakref.html#weakref.proxy)258259, используется для доступа к атрибуту объекта после его сборки мусора. Для получения дополнительной информации о слабых ссылках см. модуль260261[`weakref`](https://python-all.ru/3.1/library/weakref.html#module-weakref)262263.264265#### `exception RuntimeError`266267Возникает, когда обнаружена ошибка, не подпадающая ни под одну из других категорий. Связанное значение – это строка, указывающая, что именно пошло не так. (Это исключение в основном является пережитком предыдущей версии интерпретатора; сейчас оно используется нечасто.)268269#### `exception StopIteration`270271Возбуждается встроенной272273[`next()`](https://python-all.ru/3.1/library/functions.html#next)274275и276277[*итератора*](https://python-all.ru/3.1/glossary.html#term-iterator)278279`__next__()`280281методом для сигнализации о том, что значений больше нет.282283#### `exception SyntaxError`284285Возбуждается, когда синтаксический анализатор обнаруживает синтаксическую ошибку. Это может произойти в операторе [`import`](https://python-all.ru/3.1/reference/simple_stmts.html#import), при вызове встроенных функций [`exec()`](https://python-all.ru/3.1/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.1/library/functions.html#eval), а также при чтении начального скрипта или стандартного ввода (в том числе в интерактивном режиме).286287Экземпляры этого класса имеют атрибуты `filename`, `lineno`, `offset` и `text` для удобного доступа к подробностям. [`str()`](https://python-all.ru/3.1/library/functions.html#str) от экземпляра исключения возвращает только сообщение.288289#### `exception IndentationError`290291Базовый класс для синтаксических ошибок, связанных с неправильным отступом. Является подклассом292293[`SyntaxError`](https://python-all.ru/3.1/library/exceptions.html#SyntaxError)294295.296297#### `exception TabError`298299Возбуждается, когда в отступах используется непоследовательное сочетание табуляции и пробелов. Является подклассом300301[`IndentationError`](https://python-all.ru/3.1/library/exceptions.html#IndentationError)302303.304305#### `exception SystemError`306307Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не настолько серьезна, чтобы заставить его отказаться от всех надежд. Связанное значение представляет собой строку, указывающую на то, что пошло не так (на низкоуровневом языке).308309Сообщите об этом автору или сопровождающему вашего интерпретатора Python. Обязательно укажите версию интерпретатора Python (`sys.version`; она также выводится в начале интерактивного сеанса Python), точное сообщение об ошибке (связанное значение исключения) и, если возможно, исходный код программы, вызвавшей ошибку.310311#### `exception SystemExit`312313Это исключение возбуждается функцией [`sys.exit()`](https://python-all.ru/3.1/library/sys.html#sys.exit). Если оно не обработано, интерпретатор Python завершает работу; трассировка стека не выводится. Если связанное значение является целым числом, оно задаёт статус выхода системы (передаётся функции C `exit()`); если это `None`, статус выхода равен нулю; если оно имеет другой тип (например, строку), значение объекта выводится, а статус выхода равен единице.314315Экземпляры имеют атрибут `code`, который устанавливается в предлагаемый статус выхода или сообщение об ошибке (по умолчанию `None`). Кроме того, это исключение наследуется напрямую от [`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException), а не от [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception), поскольку технически не является ошибкой.316317Вызов [`sys.exit()`](https://python-all.ru/3.1/library/sys.html#sys.exit) преобразуется в исключение, чтобы обработчики очистки (предложения [`finally`](https://python-all.ru/3.1/reference/compound_stmts.html#finally) операторов [`try`](https://python-all.ru/3.1/reference/compound_stmts.html#try)) могли выполниться, и чтобы отладчик мог выполнить сценарий, не рискуя потерять управление. Функцию [`os._exit()`](https://python-all.ru/3.1/library/os.html#os._exit) можно использовать, если абсолютно необходимо выйти немедленно (например, в дочернем процессе после вызова `fork()`).318319Исключение наследуется от [`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException), а не от [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception), чтобы оно случайно не перехватывалось кодом, который ловит [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception). Это позволяет исключению правильно всплывать и приводить к завершению интерпретатора.320321#### `exception TypeError`322323Вызывается, когда операция или функция применяется к объекту неподходящего типа. Связанное значение – строка с подробностями о несоответствии типов.324325#### `exception UnboundLocalError`326327Возбуждается при обращении к локальной переменной в функции или методе, которой не присвоено значение. Является подклассом328329[`NameError`](https://python-all.ru/3.1/library/exceptions.html#NameError)330331.332333#### `exception UnicodeError`334335Возбуждается при возникновении ошибки кодирования или декодирования, связанной с Unicode. Является подклассом336337[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)338339.340341#### `exception UnicodeEncodeError`342343Возникает при ошибке, связанной с Unicode, во время кодирования. Является подклассом344345[`UnicodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeError)346347.348349#### `exception UnicodeDecodeError`350351Возникает при ошибке, связанной с Unicode, во время декодирования. Является подклассом352353[`UnicodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeError)354355.356357#### `exception UnicodeTranslateError`358359Возникает при ошибке, связанной с Unicode, во время трансляции. Является подклассом360361[`UnicodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeError)362363.364365#### `exception ValueError`366367Возникает, когда встроенная операция или функция получает аргумент правильного типа, но с неподходящим значением, и эта ситуация не описывается более точным исключением, например368369[`IndexError`](https://python-all.ru/3.1/library/exceptions.html#IndexError)370371.372373#### `exception VMSError`374375Доступно только в VMS. Возникает, когда происходит специфичная для VMS ошибка.376377#### `exception WindowsError`378379Возбуждается при возникновении специфической для Windows ошибки или когда номер ошибки не соответствует значению380381`errno`382383. Значения384385`winerror`386387и388389`strerror`390391создаются из возвращаемых значений функций392393`GetLastError()`394395и396397`FormatMessage()`398399из Windows Platform API. Значение400401`errno`402403отображает значение404405`winerror`406407на соответствующие значения408409`errno.h`410411. Это подкласс412413[`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError)414415.416417#### `exception ZeroDivisionError`418419Вызывается, когда второй аргумент операции деления или взятия остатка равен нулю. Связанное значение – строка, указывающая тип операндов и операцию.420421Следующие исключения используются в качестве категорий предупреждений; подробнее см. в модуле [`warnings`](https://python-all.ru/3.1/library/warnings.html#module-warnings).422423#### `exception Warning`424425Базовый класс для категорий предупреждений.426427#### `exception UserWarning`428429Базовый класс для предупреждений, генерируемых пользовательским кодом.430431#### `exception DeprecationWarning`432433Базовый класс для предупреждений об устаревших возможностях.434435#### `exception PendingDeprecationWarning`436437Базовый класс для предупреждений о возможностях, которые будут признаны устаревшими в будущем.438439#### `exception SyntaxWarning`440441Базовый класс для предупреждений о сомнительном синтаксисе.442443#### `exception RuntimeWarning`444445Базовый класс для предупреждений о сомнительном поведении во время выполнения.446447#### `exception FutureWarning`448449Базовый класс для предупреждений о конструкциях, которые в будущем изменят семантику.450451#### `exception ImportWarning`452453Базовый класс для предупреждений о возможных ошибках при импорте модулей.454455#### `exception UnicodeWarning`456457Базовый класс для предупреждений, связанных с Unicode.458459#### `exception BytesWarning`460461Базовый класс для предупреждений, связанных с462463[`bytes`](https://python-all.ru/3.1/library/functions.html#bytes)464465и466467`buffer`468469.470471## 6.1. Иерархия исключений472473Иерархия классов для встроенных исключений:474475```python476BaseException477 +-- SystemExit478 +-- KeyboardInterrupt479 +-- GeneratorExit480 +-- Exception481      +-- StopIteration482      +-- ArithmeticError483      |    +-- FloatingPointError484      |    +-- OverflowError485      |    +-- ZeroDivisionError486      +-- AssertionError487      +-- AttributeError488      +-- BufferError489      +-- EnvironmentError490      |    +-- IOError491      |    +-- OSError492      |         +-- WindowsError (Windows)493      |         +-- VMSError (VMS)494      +-- EOFError495      +-- ImportError496      +-- LookupError497      |    +-- IndexError498      |    +-- KeyError499      +-- MemoryError500      +-- NameError501      |    +-- UnboundLocalError502      +-- ReferenceError503      +-- RuntimeError504      |    +-- NotImplementedError505      +-- SyntaxError506      |    +-- IndentationError507      |         +-- TabError508      +-- SystemError509      +-- TypeError510      +-- ValueError511      |    +-- UnicodeError512      |         +-- UnicodeDecodeError513      |         +-- UnicodeEncodeError514      |         +-- UnicodeTranslateError515      +-- Warning516           +-- DeprecationWarning517           +-- PendingDeprecationWarning518           +-- RuntimeWarning519           +-- SyntaxWarning520           +-- UserWarning521           +-- FutureWarning522           +-- ImportWarning523           +-- UnicodeWarning524           +-- BytesWarning525```526