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

exceptions.md

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

1> **Источник:** https://python-all.ru/3.1/c-api/exceptions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Обработка исключений89Функции, описанные в этой главе, позволяют обрабатывать и возбуждать исключения Python. Важно понимать некоторые основы обработки исключений в Python. Механизм в чём-то похож на переменную `errno` в Unix: существует глобальный индикатор (на поток) последней произошедшей ошибки. Большинство функций не сбрасывают его при успехе, но устанавливают, чтобы указать причину ошибки в случае неудачи. Большинство функций также возвращают индикатор ошибки – обычно *NULL*, если ожидается возврат указателя, или `-1`, если возвращается целое число (исключение: функции `PyArg_*()` возвращают `1` при успехе и `0` при ошибке).1011Когда функция должна завершиться ошибкой, потому что вызванная ей функция завершилась ошибкой, она обычно не устанавливает индикатор ошибки; его уже установила вызванная функция. Она отвечает либо за обработку ошибки и очистку исключения, либо за возврат после освобождения всех удерживаемых ресурсов (таких как ссылки на объекты или выделенная память); она *не* должна продолжать нормальное выполнение, если не готова обработать ошибку. При возврате из-за ошибки важно указать вызывающему коду, что ошибка была установлена. Если ошибка не обрабатывается или не аккуратно распространяется, последующие вызовы Python/C API могут вести себя не так, как задумано, и могут отказать загадочным образом.1213Индикатор ошибки состоит из трёх объектов Python, соответствующих результату вызова `sys.exc_info()`. Существуют функции API для взаимодействия с индикатором ошибки разными способами. Для каждого потока предусмотрен отдельный индикатор ошибки.1415**void `PyErr_PrintEx`(int *set\_sys\_last\_vars*)**1617Выводит стандартную трассировку в `sys.stderr` и очищает индикатор ошибки. Вызывайте эту функцию только при установленном индикаторе ошибки (иначе возникнет фатальная ошибка!).1819Если *set\_sys\_last\_vars* не равно нулю, переменные [`sys.last_type`](https://python-all.ru/3.1/library/sys.html#sys.last_type), [`sys.last_value`](https://python-all.ru/3.1/library/sys.html#sys.last_value) и [`sys.last_traceback`](https://python-all.ru/3.1/library/sys.html#sys.last_traceback) будут установлены в тип, значение и трассировку напечатанного исключения соответственно.2021**void `PyErr_Print`()**2223Псевдоним для2425`PyErr_PrintEx(1)`2627.2829**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_Occurred`()**3031*Возвращаемое значение: заимствованная ссылка.*3233Проверяет, установлен ли индикатор ошибки. Если установлен, возвращает *тип* исключения (первый аргумент последнего вызова одной из функций `PyErr_Set*()` или [`PyErr_Restore()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_Restore)). Если не установлен, возвращает *NULL*. Вы не владеете ссылкой на возвращаемое значение, поэтому не нужно вызывать [`Py_DECREF()`](https://python-all.ru/3.1/c-api/refcounting.html#Py_DECREF).3435> **Примечание**36>37> Не сравнивайте возвращаемое значение с конкретным исключением; используйте [`PyErr_ExceptionMatches()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_ExceptionMatches), как показано ниже. (Сравнение может легко завершиться неудачей, так как исключение может быть экземпляром, а не классом, в случае исключения-класса, или оно может быть подклассом ожидаемого исключения.)3839**int `PyErr_ExceptionMatches`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**4041Эквивалентно4243`PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)`4445. Функцию следует вызывать только тогда, когда исключение действительно установлено; в противном случае возникнет нарушение доступа к памяти.4647**int `PyErr_GivenExceptionMatches`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*given*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**4849Возвращает истину, если исключение5051*given*5253соответствует исключению в5455*exc*5657. Если5859*exc*6061– объект класса, также возвращает истину, когда6263*given*6465является экземпляром подкласса. Если6667*exc*6869– кортеж, выполняется поиск совпадения по всем исключениям кортежа (и рекурсивно по вложенным кортежам).7071**void `PyErr_NormalizeException`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\*\*exc, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\*\*val, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\*\*tb)**7273При определённых обстоятельствах значения, возвращаемые7475[`PyErr_Fetch()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_Fetch)7677(см. ниже), могут оказаться «ненормализованными»:7879`*exc`8081является объектом класса, но8283`*val`8485не является экземпляром того же класса. Данная функция позволяет инстанцировать класс в таком случае. Если значения уже нормализованы, ничего не происходит. Отложенная нормализация реализована для повышения производительности.8687**void `PyErr_Clear`()**8889Очищает индикатор ошибки. Если индикатор ошибки не установлен, эффекта нет.9091**void `PyErr_Fetch`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*\*ptype*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*\*pvalue*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*\*ptraceback*)**9293Извлекает индикатор ошибки в три переменные, адреса которых передаются. Если индикатор ошибки не установлен, устанавливает все три переменные в *NULL*. Если установлен, он будет очищен, и вы получаете владение ссылкой на каждый извлечённый объект. Значение и объект traceback могут быть *NULL*, даже если объект типа не NULL.9495> **Примечание**96>97> Эта функция обычно используется только кодом, которому нужно обрабатывать исключения, или кодом, которому требуется временно сохранить и восстановить индикатор ошибки.9899**void `PyErr_Restore`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*value*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*traceback*)**100101Set the error indicator from the three objects. If the error indicator is already set, it is cleared first. If the objects are *NULL*, the error indicator is cleared. Do not pass a *NULL* type and non-*NULL* value or traceback. The exception type should be a class. Do not pass an invalid exception type or value. (Violating these rules will cause subtle problems later.) This call takes away a reference to each object: you must own a reference to each object before the call and after the call you no longer own these references. (If you don’t understand this, don’t use this function. I warned you.)102103> **Примечание**104>105> Эта функция обычно используется только кодом, которому нужно временно сохранить и восстановить индикатор ошибки; для сохранения текущего состояния исключения используйте [`PyErr_Fetch()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_Fetch).106107**void `PyErr_SetString`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, const char *\*message*)**108109Это наиболее распространённый способ установки индикатора ошибки. Первый аргумент задаёт тип исключения; обычно это одно из стандартных исключений, например110111`PyExc_RuntimeError`112113. Увеличивать его счётчик ссылок не требуется. Второй аргумент – сообщение об ошибке; оно преобразуется в строковый объект.114115**void `PyErr_SetObject`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*value*)**116117Эта функция аналогична118119[`PyErr_SetString()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_SetString)120121, но позволяет указать произвольный объект Python для параметра «value» исключения.122123**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_Format`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exception*, const char *\*format*, ...)**124125*Возвращаемое значение: всегда NULL.*126127Эта функция устанавливает индикатор ошибки и возвращает *NULL*. *исключение* должно быть классом исключения Python. Параметры *format* и последующие помогают отформатировать сообщение об ошибке; они имеют тот же смысл и значения, что и в [`PyUnicode_FromFormat()`](https://python-all.ru/3.1/c-api/unicode.html#PyUnicode_FromFormat).128129**void `PyErr_SetNone`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*)**130131Это сокращённая запись для132133`PyErr_SetObject(type, Py_None)`134135.136137**int `PyErr_BadArgument`()**138139Это сокращённая запись для140141`PyErr_SetString(PyExc_TypeError, message)`142143, где144145*message*146147указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном используется внутри.148149**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_NoMemory`()**150151*Возвращаемое значение: всегда NULL.*152153Это сокращённая запись для `PyErr_SetNone(PyExc_MemoryError)`; она возвращает *NULL*, чтобы функция выделения объекта могла написать `return PyErr_NoMemory();` при нехватке памяти.154155**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetFromErrno`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*)**156157*Возвращаемое значение: всегда NULL.*158159Это вспомогательная функция для возбуждения исключения, когда функция библиотеки C вернула ошибку и установила переменную C `errno`. Она создаёт объект-кортеж, первый элемент которого – целое значение `errno`, а второй – соответствующее сообщение об ошибке (полученное через `strerror()`), и затем вызывает `PyErr_SetObject(type, object)`. В Unix, когда значение `errno` равно `EINTR`, что указывает на прерванный системный вызов, эта функция вызывает [`PyErr_CheckSignals()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_CheckSignals), и если тот установил индикатор ошибки, оставляет его таким. Функция всегда возвращает *NULL*, поэтому обёрточная функция вокруг системного вызова может написать `return PyErr_SetFromErrno(type);` когда системный вызов возвращает ошибку.160161**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetFromErrnoWithFilename`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, const char *\*filename*)**162163*Возвращаемое значение: всегда NULL.*164165Похожа на [`PyErr_SetFromErrno()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_SetFromErrno), с дополнительным поведением: если *filename* не равен *NULL*, он передаётся конструктору *type* в качестве третьего параметра. Для таких исключений, как [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError) и [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError), это используется для определения атрибута `filename` экземпляра исключения.166167**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetFromWindowsErr`(int *ierr*)**168169*Возвращаемое значение: всегда NULL.*170171Это вспомогательная функция для возбуждения [`WindowsError`](https://python-all.ru/3.1/library/exceptions.html#WindowsError). Если вызвана с *ierr* равным `0`, используется код ошибки, возвращённый вызовом `GetLastError()`. Она вызывает функцию Win32 `FormatMessage()`, чтобы получить описание Windows для кода ошибки, заданного *ierr* или `GetLastError()`, затем создаёт объект-кортеж, первый элемент которого – значение *ierr*, а второй – соответствующее сообщение об ошибке (полученное через `FormatMessage()`), и затем вызывает `PyErr_SetObject(PyExc_WindowsError, object)`. Эта функция всегда возвращает *NULL*. Доступность: Windows.172173**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetExcFromWindowsErr`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, int *ierr*)**174175*Возвращаемое значение: всегда NULL.*176177Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_SetFromWindowsErr), с дополнительным параметром, указывающим тип возбуждаемого исключения. Доступность: Windows.178179**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetFromWindowsErrWithFilename`(int *ierr*, const char *\*filename*)**180181*Возвращаемое значение: всегда NULL.*182183Похожа на [`PyErr_SetFromWindowsErr()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_SetFromWindowsErr), с дополнительным поведением: если *filename* не равен *NULL*, он передаётся конструктору [`WindowsError`](https://python-all.ru/3.1/library/exceptions.html#WindowsError) в качестве третьего параметра. Доступность: Windows.184185**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_SetExcFromWindowsErrWithFilename`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*type*, int *ierr*, char *\*filename*)**186187*Возвращаемое значение: всегда NULL.*188189Аналогично [`PyErr_SetFromWindowsErrWithFilename()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_SetFromWindowsErrWithFilename), с дополнительным параметром, указывающим тип возбуждаемого исключения. Доступность: Windows.190191**void `PyErr_BadInternalCall`()**192193Это сокращённая форма для194195`PyErr_SetString(PyExc_SystemError, message)`196197, где198199*message*200201указывает, что внутренняя операция (например, функция Python/C API) была вызвана с недопустимым аргументом. В основном используется внутри.202203**int `PyErr_WarnEx`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*category*, char *\*message*, int *stacklevel*)**204205Выдаёт предупреждение. Аргумент *category* – это категория предупреждения (см. ниже) или *NULL*; аргумент *message* – строка сообщения. *stacklevel* – положительное число, задающее количество кадров стека; предупреждение будет выдано из строки кода, выполняющейся в этом кадре стека. *stacklevel*, равный 1, соответствует функции, вызывающей [`PyErr_WarnEx()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_WarnEx), 2 – функции, вызвавшей её, и так далее.206207Обычно эта функция выводит предупреждение в *sys.stderr*; однако возможно, что пользователь указал превращать предупреждения в ошибки, и в этом случае будет вызвано исключение. Также возможно, что функция вызывает исключение из-за проблемы в механизме предупреждений (реализация импортирует модуль [`warnings`](https://python-all.ru/3.1/library/warnings.html#module-warnings) для выполнения основной работы). Возвращаемое значение – `0`, если исключение не возникло, или `-1`, если возникло. (Невозможно определить, было ли предупреждение фактически выведено, а также причину исключения; это сделано намеренно.) Если возникло исключение, вызывающий код должен выполнить обычную обработку исключений (например, [`Py_DECREF()`](https://python-all.ru/3.1/c-api/refcounting.html#Py_DECREF) для владеемых ссылок и вернуть значение ошибки).208209Категории предупреждений должны быть подклассами `Warning`; категория предупреждения по умолчанию – `RuntimeWarning`. Стандартные категории предупреждений Python доступны как глобальные переменные, имена которых – `PyExc_`, за которым следует имя исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/3.1/c-api/structures.html#PyObject); все они являются объектами классов. Их имена: `PyExc_Warning`, `PyExc_UserWarning`, `PyExc_UnicodeWarning`, `PyExc_DeprecationWarning`, `PyExc_SyntaxWarning`, `PyExc_RuntimeWarning` и `PyExc_FutureWarning`. `PyExc_Warning` является подклассом `PyExc_Exception`; остальные категории предупреждений являются подклассами `PyExc_Warning`.210211Подробнее об управлении предупреждениями см. документацию модуля [`warnings`](https://python-all.ru/3.1/library/warnings.html#module-warnings) и опцию *-W* в документации командной строки. C API для управления предупреждениями не существует.212213**int `PyErr_WarnExplicit`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*category*, const char *\*message*, const char *\*filename*, int *lineno*, const char *\*module*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*registry*)**214215Выдаёт предупреждение с явным контролем всех атрибутов предупреждения. Это простая обёртка вокруг функции Python216217[`warnings.warn_explicit()`](https://python-all.ru/3.1/library/warnings.html#warnings.warn_explicit)218219, см. описание там. Аргументы220221*module*222223и224225*registry*226227могут быть установлены в228229*NULL*230231для получения эффекта по умолчанию, как описано там.232233**int `PyErr_CheckSignals`()**234235Эта функция взаимодействует с обработкой сигналов Python. Она проверяет, был ли отправлен сигнал процессам, и если да, вызывает соответствующий обработчик сигнала. Если модуль [`signal`](https://python-all.ru/3.1/library/signal.html#module-signal) поддерживается, может быть вызван обработчик сигнала, написанный на Python. Во всех случаях действие по умолчанию для `SIGINT` – возбуждение исключения [`KeyboardInterrupt`](https://python-all.ru/3.1/library/exceptions.html#KeyboardInterrupt). Если исключение возбуждено, устанавливается индикатор ошибки, и функция возвращает `-1`; в противном случае функция возвращает `0`. Индикатор ошибки может быть сброшен или не сброшен, если он был установлен ранее.236237**void `PyErr_SetInterrupt`()**238239Эта функция имитирует поступление сигнала `SIGINT` – при следующем вызове [`PyErr_CheckSignals()`](https://python-all.ru/3.1/c-api/exceptions.html#PyErr_CheckSignals) будет возбуждено исключение [`KeyboardInterrupt`](https://python-all.ru/3.1/library/exceptions.html#KeyboardInterrupt). Может быть вызвана без захвата блокировки интерпретатора.240241**int `PySignal_SetWakeupFd`(int *fd*)**242243Эта вспомогательная функция задаёт файловый дескриптор, в который будет записан байт244245`'\0'`246247при получении сигнала. Возвращает предыдущий такой файловый дескриптор. Значение248249`-1`250251отключает эту возможность; это начальное состояние. Эквивалентно252253[`signal.set_wakeup_fd()`](https://python-all.ru/3.1/library/signal.html#signal.set_wakeup_fd)254255в Python, но без проверки ошибок.256257*fd*258259должен быть корректным файловым дескриптором. Функцию следует вызывать только из главного потока.260261**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyErr_NewException`(char *\*name*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*base*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*dict*)**262263*Возвращаемое значение: новая ссылка.*264265Эта вспомогательная функция создаёт и возвращает новый объект исключения. Аргумент *name* должен задавать имя нового исключения – строку C в формате `module.class`. Аргументы *base* и *dict* обычно равны *NULL*. Функция создаёт объект класса, производного от [`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception) (на C доступен как `PyExc_Exception`).266267Атрибут `__module__` нового класса устанавливается в первую часть (до последней точки) аргумента *name*, а имя класса – в последнюю часть (после последней точки). Аргумент *base* можно использовать для указания альтернативных базовых классов; это может быть как один класс, так и кортеж классов. Аргумент *dict* можно использовать для указания словаря переменных и методов класса.268269**void `PyErr_WriteUnraisable`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*obj*)**270271Эта вспомогательная функция выводит предупреждение в `sys.stderr`, когда исключение установлено, но интерпретатор не может его фактически возбудить. Используется, например, когда исключение возникает в методе [`__del__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__del__).272273Функция вызывается с одним аргументом *obj*, который идентифицирует контекст, в котором возникло не вызываемое исключение. В сообщении предупреждения будет выведено repr от *obj*.274275## Объекты исключений276277**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyException_GetTraceback`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*)**278279Возвращает traceback, связанный с исключением, как новую ссылку, доступную из Python через280281`__traceback__`282283. Если traceback не связан, возвращает284285*NULL*286287.288289**int `PyException_SetTraceback`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*tb*)**290291Устанавливает traceback, связанный с исключением, в292293*tb*294295. Используйте296297`Py_None`298299для его очистки.300301**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyException_GetContext`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*)**302303Возвращает контекст (другой экземпляр исключения, при обработке которого было возбуждено304305*ex*306307), связанный с исключением, как новую ссылку, доступную из Python через308309`__context__`310311. Если контекст не связан, возвращает312313*NULL*314315.316317**void `PyException_SetContext`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ctx*)**318319Устанавливает контекст, связанный с исключением, в320321*ctx*322323. Используйте324325*NULL*326327для его очистки. Проверка типа на то, что328329*ctx*330331является экземпляром исключения, не выполняется. Функция забирает ссылку на332333*ctx*334335.336337**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyException_GetCause`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*)**338339Возвращает причину (другой экземпляр исключения, заданный через340341`raise ... from ...`342343) для этого исключения в виде новой ссылки, как это доступно из Python через344345`__cause__`346347. Если причина не задана, возвращается348349*NULL*350351.352353**void `PyException_SetCause`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ex*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*ctx*)**354355Устанавливает причину, связанную с исключением, в356357*ctx*358359. Используйте360361*NULL*362363, чтобы очистить её. Проверка типа на то, что364365*ctx*366367является экземпляром исключения, не выполняется. Это похищает ссылку на368369*ctx*370371.372373## Объекты исключений Unicode374375Следующие функции используются для создания и изменения исключений Unicode из C.376377**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeDecodeError_Create`(const char *\*encoding*, const char *\*object*, Py\_ssize\_t *length*, Py\_ssize\_t *start*, Py\_ssize\_t *end*, const char *\*reason*)**378379Создаёт объект380381[`UnicodeDecodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeDecodeError)382383с атрибутами384385*encoding*386387,388389*object*390391,392393*length*394395,396397*start*398399,400401*end*402403и404405*reason*406407.408409**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeEncodeError_Create`(const char *\*encoding*, const [Py\_UNICODE](https://python-all.ru/3.1/c-api/unicode.html#Py_UNICODE) *\*object*, Py\_ssize\_t *length*, Py\_ssize\_t *start*, Py\_ssize\_t *end*, const char *\*reason*)**410411Создаёт объект412413[`UnicodeEncodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeEncodeError)414415с атрибутами416417*encoding*418419,420421*object*422423,424425*length*426427,428429*start*430431,432433*end*434435и436437*reason*438439.440441**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeTranslateError_Create`(const [Py\_UNICODE](https://python-all.ru/3.1/c-api/unicode.html#Py_UNICODE) *\*object*, Py\_ssize\_t *length*, Py\_ssize\_t *start*, Py\_ssize\_t *end*, const char *\*reason*)**442443Создаёт объект444445[`UnicodeTranslateError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeTranslateError)446447с атрибутами448449*object*450451,452453*length*454455,456457*start*458459,460461*end*462463и464465*reason*466467.468469**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeDecodeError_GetEncoding`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**470471**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeEncodeError_GetEncoding`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**472473Возвращает атрибут474475*encoding*476477указанного объекта исключения.478479**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeDecodeError_GetObject`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**480481**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeEncodeError_GetObject`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**482483**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeTranslateError_GetObject`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**484485Возвращает атрибут486487*object*488489указанного объекта исключения.490491**int `PyUnicodeDecodeError_GetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*start*)**492493**int `PyUnicodeEncodeError_GetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*start*)**494495**int `PyUnicodeTranslateError_GetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*start*)**496497Получает атрибут498499*start*500501заданного объекта исключения и помещает его в502503*\*start*504505.506507*start*508509не должен быть510511*NULL*512513. Возвращает514515`0`516517в случае успеха,518519`-1`520521при неудаче.522523**int `PyUnicodeDecodeError_SetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *start*)**524525**int `PyUnicodeEncodeError_SetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *start*)**526527**int `PyUnicodeTranslateError_SetStart`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *start*)**528529Устанавливает атрибут530531*start*532533указанного объекта исключения в значение534535*start*536537. Возвращает538539`0`540541при успехе,542543`-1`544545при ошибке.546547**int `PyUnicodeDecodeError_GetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*end*)**548549**int `PyUnicodeEncodeError_GetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*end*)**550551**int `PyUnicodeTranslateError_GetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *\*end*)**552553Получает атрибут554555*end*556557заданного объекта исключения и помещает его в558559*\*end*560561.562563*end*564565не должен быть566567*NULL*568569. Возвращает570571`0`572573в случае успеха,574575`-1`576577при неудаче.578579**int `PyUnicodeDecodeError_SetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *end*)**580581**int `PyUnicodeEncodeError_SetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *end*)**582583**int `PyUnicodeTranslateError_SetEnd`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, Py\_ssize\_t *end*)**584585Устанавливает атрибут586587*end*588589указанного объекта исключения в590591*end*592593. Возвращает594595`0`596597в случае успеха,598599`-1`600601при ошибке.602603**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeDecodeError_GetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**604605**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeEncodeError_GetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**606607**[PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject)\* `PyUnicodeTranslateError_GetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*)**608609Возвращает атрибут610611*reason*612613указанного объекта исключения.614615**int `PyUnicodeDecodeError_SetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, const char *\*reason*)**616617**int `PyUnicodeEncodeError_SetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, const char *\*reason*)**618619**int `PyUnicodeTranslateError_SetReason`([PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*exc*, const char *\*reason*)**620621Устанавливает атрибут622623*reason*624625указанного объекта исключения в значение626627*reason*628629. Возвращает630631`0`632633в случае успеха,634635`-1`636637в случае ошибки.638639## Управление рекурсией640641Эти две функции предоставляют способ выполнения безопасных рекурсивных вызовов на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает свою глубину рекурсии).642643**int `Py_EnterRecursiveCall`(char *\*where*)**644645Отмечает точку, в которой будет выполнен рекурсивный вызов на уровне C.646647Если определён `USE_STACKCHECK`, эта функция проверяет, не переполнился ли стек ОС, с помощью [`PyOS_CheckStack()`](https://python-all.ru/3.1/c-api/sys.html#PyOS_CheckStack). Если это так, она устанавливает [`MemoryError`](https://python-all.ru/3.1/library/exceptions.html#MemoryError) и возвращает ненулевое значение.648649Затем функция проверяет, достигнут ли лимит рекурсии. Если это так, устанавливается [`RuntimeError`](https://python-all.ru/3.1/library/exceptions.html#RuntimeError) и возвращается ненулевое значение. В противном случае возвращается ноль.650651*where* должна быть строкой, например `" in instance check"`, которая будет добавлена к сообщению [`RuntimeError`](https://python-all.ru/3.1/library/exceptions.html#RuntimeError), вызванному пределом глубины рекурсии.652653**void `Py_LeaveRecursiveCall`()**654655Завершает656657[`Py_EnterRecursiveCall()`](https://python-all.ru/3.1/c-api/exceptions.html#Py_EnterRecursiveCall)658659. Должен вызываться один раз для каждого660661*успешного*662663вызова664665[`Py_EnterRecursiveCall()`](https://python-all.ru/3.1/c-api/exceptions.html#Py_EnterRecursiveCall)666667.668669## Стандартные исключения670671Все стандартные исключения Python доступны как глобальные переменные, имена которых состоят из `PyExc_`, за которым следует имя исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/3.1/c-api/structures.html#PyObject); все они являются объектами классов. Для полноты картины, вот все переменные:672673| Имя в C | Имя в Python | Примечания |674| --- | --- | --- |675| `PyExc_BaseException` | [`BaseException`](https://python-all.ru/3.1/library/exceptions.html#BaseException) | (1) |676| `PyExc_Exception` | [`исключение`](https://python-all.ru/3.1/library/exceptions.html#Exception) | (1) |677| `PyExc_ArithmeticError` | [`ArithmeticError`](https://python-all.ru/3.1/library/exceptions.html#ArithmeticError) | (1) |678| `PyExc_LookupError` | [`LookupError`](https://python-all.ru/3.1/library/exceptions.html#LookupError) | (1) |679| `PyExc_AssertionError` | [`AssertionError`](https://python-all.ru/3.1/library/exceptions.html#AssertionError) |  |680| `PyExc_AttributeError` | [`AttributeError`](https://python-all.ru/3.1/library/exceptions.html#AttributeError) |  |681| `PyExc_EOFError` | [`EOFError`](https://python-all.ru/3.1/library/exceptions.html#EOFError) |  |682| `PyExc_EnvironmentError` | [`EnvironmentError`](https://python-all.ru/3.1/library/exceptions.html#EnvironmentError) | (1) |683| `PyExc_FloatingPointError` | [`FloatingPointError`](https://python-all.ru/3.1/library/exceptions.html#FloatingPointError) |  |684| `PyExc_IOError` | [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError) |  |685| `PyExc_ImportError` | [`ImportError`](https://python-all.ru/3.1/library/exceptions.html#ImportError) |  |686| `PyExc_IndexError` | [`IndexError`](https://python-all.ru/3.1/library/exceptions.html#IndexError) |  |687| `PyExc_KeyError` | [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError) |  |688| `PyExc_KeyboardInterrupt` | [`KeyboardInterrupt`](https://python-all.ru/3.1/library/exceptions.html#KeyboardInterrupt) |  |689| `PyExc_MemoryError` | [`MemoryError`](https://python-all.ru/3.1/library/exceptions.html#MemoryError) |  |690| `PyExc_NameError` | [`NameError`](https://python-all.ru/3.1/library/exceptions.html#NameError) |  |691| `PyExc_NotImplementedError` | [`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError) |  |692| `PyExc_OSError` | [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError) |  |693| `PyExc_OverflowError` | [`OverflowError`](https://python-all.ru/3.1/library/exceptions.html#OverflowError) |  |694| `PyExc_ReferenceError` | [`ReferenceError`](https://python-all.ru/3.1/library/exceptions.html#ReferenceError) | (2) |695| `PyExc_RuntimeError` | [`RuntimeError`](https://python-all.ru/3.1/library/exceptions.html#RuntimeError) |  |696| `PyExc_SyntaxError` | [`SyntaxError`](https://python-all.ru/3.1/library/exceptions.html#SyntaxError) |  |697| `PyExc_SystemError` | [`SystemError`](https://python-all.ru/3.1/library/exceptions.html#SystemError) |  |698| `PyExc_SystemExit` | [`SystemExit`](https://python-all.ru/3.1/library/exceptions.html#SystemExit) |  |699| `PyExc_TypeError` | [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError) |  |700| `PyExc_ValueError` | [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError) |  |701| `PyExc_WindowsError` | [`WindowsError`](https://python-all.ru/3.1/library/exceptions.html#WindowsError) | (3) |702| `PyExc_ZeroDivisionError` | [`ZeroDivisionError`](https://python-all.ru/3.1/library/exceptions.html#ZeroDivisionError) |  |703704Примечания:7057061. Это базовый класс для других стандартных исключений.7072. То же самое, что [`weakref.ReferenceError`](https://python-all.ru/3.1/library/weakref.html#weakref.ReferenceError).7083. Определён только в Windows; код, использующий это, должен проверять, определён ли макрос препроцессора `MS_WINDOWS`.709