exceptions.md
1> **Источник:** https://python-all.ru/3.13/c-api/exceptions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Обработка исключений89Функции, описанные в этой главе, позволяют обрабатывать и возбуждать исключения Python. Важно понимать некоторые основы обработки исключений Python. Она работает примерно как переменная `errno` в POSIX: существует глобальный индикатор (на поток) последней произошедшей ошибки. Большинство функций C API не очищают его при успехе, но устанавливают его, чтобы указать причину ошибки при неудаче. Большинство функций C API также возвращают индикатор ошибки, обычно `NULL`, если они должны вернуть указатель, или `-1`, если они возвращают целое число (исключение: функции `PyArg_*` возвращают `1` при успехе и `0` при неудаче).1011Конкретно, индикатор ошибки состоит из трех указателей на объекты: тип исключения, значение исключения и объект трассировки. Любой из этих указателей может быть `NULL`, если не установлен (хотя некоторые комбинации запрещены, например, нельзя иметь не-`NULL` трассировку, если тип исключения `NULL`).1213Когда функция должна завершиться ошибкой, потому что вызванная ей функция завершилась ошибкой, она обычно не устанавливает индикатор ошибки; его уже установила вызванная функция. Она отвечает либо за обработку ошибки и очистку исключения, либо за возврат после освобождения всех удерживаемых ресурсов (таких как ссылки на объекты или выделенная память); она *не* должна продолжать нормальное выполнение, если не готова обработать ошибку. При возврате из-за ошибки важно указать вызывающему коду, что ошибка была установлена. Если ошибка не обрабатывается или не аккуратно распространяется, последующие вызовы Python/C API могут вести себя не так, как задумано, и могут отказать загадочным образом.1415> **Примечание**16>17> Индикатор ошибки **не** является результатом [`sys.exc_info()`](https://python-all.ru/3.13/library/sys.html#sys.exc_info). Первый соответствует исключению, которое еще не перехвачено (и поэтому все еще распространяется), тогда как второй возвращает исключение после его перехвата (и поэтому прекратило распространение).1819## Печать и очистка2021#### `void PyErr_Clear()`2223*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*2425Очищает индикатор ошибки. Если индикатор ошибки не установлен, эффекта нет.2627#### `void PyErr_PrintEx(int set_sys_last_vars)`2829*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*3031Печатает стандартную трассировку в `sys.stderr` и очищает индикатор ошибки. **За исключением** случая, когда ошибка является `SystemExit`, в этом случае трассировка не печатается, и процесс Python завершится с кодом ошибки, указанным экземпляром `SystemExit`.3233Вызывайте эту функцию **только**, когда установлен индикатор ошибки. В противном случае это вызовет фатальную ошибку!3435Если *set\_sys\_last\_vars* не равно нулю, переменная [`sys.last_exc`](https://python-all.ru/3.13/library/sys.html#sys.last_exc) устанавливается в напечатанное исключение. Для обратной совместимости устаревшие переменные [`sys.last_type`](https://python-all.ru/3.13/library/sys.html#sys.last_type), [`sys.last_value`](https://python-all.ru/3.13/library/sys.html#sys.last_value) и [`sys.last_traceback`](https://python-all.ru/3.13/library/sys.html#sys.last_traceback) также устанавливаются в тип, значение и трассировку этого исключения соответственно.3637Изменено в версии 3.12: Добавлена установка [`sys.last_exc`](https://python-all.ru/3.13/library/sys.html#sys.last_exc).3839#### `void PyErr_Print()`4041*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*4243Псевдоним для `PyErr_PrintEx(1)`.4445#### `void PyErr_WriteUnraisable(PyObject *obj)`4647*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*4849Вызывает [`sys.unraisablehook()`](https://python-all.ru/3.13/library/sys.html#sys.unraisablehook) с использованием текущего исключения и аргумента *obj*.5051Эта вспомогательная функция выводит предупреждающее сообщение в `sys.stderr`, когда исключение было установлено, но интерпретатор не может его фактически возбудить. Она используется, например, когда исключение возникает в методе [`__del__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__del__).5253Функция вызывается с единственным аргументом *obj*, который идентифицирует контекст, в котором возникло невыбрасываемое исключение. Если возможно, repr *obj* будет напечатан в предупреждающем сообщении. Если *obj* равен `NULL`, печатается только трассировка.5455При вызове этой функции должно быть установлено исключение.5657Изменено в версии 3.4: Печатает трассировку. Печатает только трассировку, если *obj* равен `NULL`.5859Изменено в версии 3.8: Используйте [`sys.unraisablehook()`](https://python-all.ru/3.13/library/sys.html#sys.unraisablehook).6061#### `void PyErr_FormatUnraisable(const char *format, ...)`6263Аналогично [`PyErr_WriteUnraisable()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WriteUnraisable), но *format* и последующие параметры помогают форматировать предупреждающее сообщение; они имеют тот же смысл и те же значения, что и в [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat). `PyErr_WriteUnraisable(obj)` примерно эквивалентна `PyErr_FormatUnraisable("Exception ignored in: %R", obj)`. Если *format* равен `NULL`, печатается только трассировка.6465Добавлено в версии 3.13.6667#### `void PyErr_DisplayException(PyObject *exc)`6869*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*7071Печатает стандартное отображение трассировки `exc` в `sys.stderr`, включая цепочки исключений и примечания.7273Добавлено в версии 3.12.7475## Возбуждение исключений7677Эти функции помогают установить индикатор ошибки текущего потока. Для удобства некоторые из этих функций всегда возвращают указатель `NULL` для использования в операторе `return`.7879#### `void PyErr_SetString(PyObject *type, const char *message)`8081*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*8283Это наиболее распространенный способ установки индикатора ошибки. Первый аргумент указывает тип исключения; обычно это одно из стандартных исключений, например [`PyExc_RuntimeError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_RuntimeError). Не нужно создавать новую [сильную ссылку](https://python-all.ru/3.13/glossary.html#term-strong-reference) на него (например, с помощью [`Py_INCREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_INCREF)). Второй аргумент – сообщение об ошибке; оно декодируется из `'utf-8'`.8485#### `void PyErr_SetObject(PyObject *type, PyObject *value)`8687*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*8889Эта функция аналогична [`PyErr_SetString()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetString), но позволяет указать произвольный объект Python для «значения» исключения.9091#### `PyObject *PyErr_Format(PyObject *exception, const char *format, ...)`9293*Возвращаемое значение: всегда NULL.*9495*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*9697Эта функция устанавливает индикатор ошибки и возвращает `NULL`. *исключение* должен быть классом исключения Python. Параметры *format* и последующие помогают форматировать сообщение об ошибке; они имеют тот же смысл и значения, что и в [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat). *format* – это строка в кодировке ASCII.9899#### `PyObject *PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)`100101*Возвращаемое значение: Всегда NULL.*102103*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*104105То же, что и [`PyErr_Format()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_Format), но принимает аргумент `va_list` вместо переменного числа аргументов.106107Добавлено в версии 3.5.108109#### `void PyErr_SetNone(PyObject *type)`110111*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*112113Это сокращение для `PyErr_SetObject(type, Py_None)`.114115#### `int PyErr_BadArgument()`116117*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*118119Это сокращение для `PyErr_SetString(PyExc_TypeError, message)`, где *message* указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном предназначено для внутреннего использования.120121#### `PyObject *PyErr_NoMemory()`122123*Возвращаемое значение: всегда NULL.*124125*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*126127Это сокращение для `PyErr_SetNone(PyExc_MemoryError)`; оно возвращает `NULL`, чтобы функция выделения объекта могла написать `return PyErr_NoMemory();`, когда заканчивается память.128129#### `PyObject *PyErr_SetFromErrno(PyObject *type)`130131*Возвращаемое значение: всегда NULL.*132133*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*134135Это удобная функция для возбуждения исключения, когда функция библиотеки C вернула ошибку и установила переменную C `errno`. Она создает объект кортежа, первый элемент которого – целочисленное значение `errno`, а второй – соответствующее сообщение об ошибке (полученное из `strerror()`), а затем вызывает `PyErr_SetObject(type, object)`. В Unix, когда значение `errno` равно `EINTR`, что указывает на прерванный системный вызов, эта функция вызывает [`PyErr_CheckSignals()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_CheckSignals), и если та устанавливает индикатор ошибки, оставляет его установленным на это. Функция всегда возвращает `NULL`, так что функция-обертка вокруг системного вызова может написать `return PyErr_SetFromErrno(type);`, когда системный вызов возвращает ошибку.136137#### `PyObject *PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)`138139*Возвращаемое значение: всегда NULL.*140141*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*142143Аналогично [`PyErr_SetFromErrno()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromErrno), с тем дополнением, что если *filenameObject* не равно `NULL`, он передаётся конструктору *type* в качестве третьего параметра. В случае исключения [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) это используется для задания атрибута `filename` экземпляра исключения.144145#### `PyObject *PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)`146147*Возвращаемое значение: всегда NULL.*148149*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.*150151Аналогично [`PyErr_SetFromErrnoWithFilenameObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromErrnoWithFilenameObject), но принимает второй объект имени файла; используется для возбуждения ошибок, когда функция, принимающая два имени файла, завершается неудачей.152153Добавлено в версии 3.4.154155#### `PyObject *PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)`156157*Возвращаемое значение: всегда NULL.*158159*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*160161Аналогично [`PyErr_SetFromErrnoWithFilenameObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromErrnoWithFilenameObject), но имя файла задаётся как C-строка. *filename* декодируется с использованием [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.13/glossary.html#term-filesystem-encoding-and-error-handler).162163#### `PyObject *PyErr_SetFromWindowsErr(int ierr)`164165*Возвращаемое значение: всегда NULL.*166167*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*168169Это удобная функция для возбуждения [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError). Если она вызвана с *ierr* равным `0`, то вместо него используется код ошибки, возвращённый вызовом `GetLastError()`. Она вызывает функцию Win32 `FormatMessage()` для получения описания Windows для кода ошибки, заданного *ierr* или `GetLastError()`, затем создаёт объект `OSError`, устанавливая атрибут [`winerror`](https://python-all.ru/3.13/library/exceptions.html#OSError.winerror) в код ошибки, атрибут [`strerror`](https://python-all.ru/3.13/library/exceptions.html#OSError.strerror) – в соответствующее сообщение об ошибке (полученное из `FormatMessage()`), после чего вызывает `PyErr_SetObject(PyExc_OSError, object)`. Эта функция всегда возвращает `NULL`.170171[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.172173#### `PyObject *PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)`174175*Возвращаемое значение: всегда NULL.*176177*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*178179Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromWindowsErr), с дополнительным параметром, указывающим тип возбуждаемого исключения.180181[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.182183#### `PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)`184185*Возвращаемое значение: всегда NULL.*186187*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*188189Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromWindowsErr), с тем дополнением, что если *filename* не равно `NULL`, он декодируется из кодировки файловой системы ([`os.fsdecode()`](https://python-all.ru/3.13/library/os.html#os.fsdecode)) и передаётся конструктору [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) в качестве третьего параметра для задания атрибута `filename` экземпляра исключения.190191[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.192193#### `PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)`194195*Возвращаемое значение: всегда NULL.*196197*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*198199Аналогично [`PyErr_SetExcFromWindowsErr()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetExcFromWindowsErr), с тем дополнением, что если *filename* не равно `NULL`, он передаётся конструктору [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) в качестве третьего параметра для задания атрибута `filename` экземпляра исключения.200201[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.202203#### `PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)`204205*Возвращаемое значение: всегда NULL.*206207*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*208209Аналогично [`PyErr_SetExcFromWindowsErrWithFilenameObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetExcFromWindowsErrWithFilenameObject), но принимает второй объект имени файла.210211[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.212213Добавлено в версии 3.4.214215#### `PyObject *PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)`216217*Возвращаемое значение: всегда NULL.*218219*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) на Windows начиная с версии 3.7.*220221Аналогично [`PyErr_SetFromWindowsErrWithFilename()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetFromWindowsErrWithFilename), с дополнительным параметром, указывающим тип возбуждаемого исключения.222223[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Windows.224225#### `PyObject *PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)`226227*Возвращаемое значение: всегда NULL.*228229*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.*230231Это удобная функция для возбуждения [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError). *msg* будет установлен как строка сообщения исключения. *name* и *path*, оба могут быть `NULL`, будут установлены как соответствующие атрибуты `ImportError`: `name` и `path`.232233Добавлено в версии 3.3.234235#### `PyObject *PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)`236237*Возвращаемое значение: всегда NULL.*238239*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.6.*240241Очень похожа на [`PyErr_SetImportError()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetImportError), но эта функция позволяет указать подкласс [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) для возбуждения.242243Добавлено в версии 3.6.244245#### `void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)`246247Устанавливает информацию о файле, строке и смещении для текущего исключения. Если текущее исключение не является [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError), то устанавливаются дополнительные атрибуты, из-за которых подсистема печати исключений считает исключение `SyntaxError`.248249Добавлено в версии 3.4.250251#### `void PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset)`252253Аналогично [`PyErr_SyntaxLocationObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SyntaxLocationObject), но также устанавливает информацию *end\_lineno* и *end\_col\_offset* для текущего исключения.254255Добавлено в версии 3.10.256257#### `void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)`258259*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.*260261Как [`PyErr_SyntaxLocationObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SyntaxLocationObject), но *filename* – это байтовая строка, декодированная из [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.13/glossary.html#term-filesystem-encoding-and-error-handler).262263Добавлено в версии 3.2.264265#### `void PyErr_SyntaxLocation(const char *filename, int lineno)`266267*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*268269Как [`PyErr_SyntaxLocationEx()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SyntaxLocationEx), но параметр *col\_offset* опущен.270271#### `void PyErr_BadInternalCall()`272273*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*274275Это сокращение для `PyErr_SetString(PyExc_SystemError, message)`, где *message* указывает, что внутренняя операция (например, функция Python/C API) была вызвана с недопустимым аргументом. Предназначено в основном для внутреннего использования.276277#### `PyObject *PyErr_ProgramTextObject(PyObject *filename, int lineno)`278279Получить строку исходного кода в *filename* на строке *lineno*. *filename* должен быть объектом Python [`str`](https://python-all.ru/3.13/library/stdtypes.html#str).280281В случае успеха эта функция возвращает строковый объект Python с найденной строкой. В случае неудачи эта функция возвращает `NULL` без установленного исключения.282283#### `PyObject *PyErr_ProgramText(const char *filename, int lineno)`284285*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*286287Аналогично [`PyErr_ProgramTextObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_ProgramTextObject), но *filename* – это const char\*, который декодируется с помощью [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.13/glossary.html#term-filesystem-encoding-and-error-handler), вместо ссылки на объект Python.288289## Выдача предупреждений290291Используйте эти функции для выдачи предупреждений из кода на C. Они аналогичны соответствующим функциям, экспортируемым модулем Python [`warnings`](https://python-all.ru/3.13/library/warnings.html#module-warnings). Обычно они выводят предупреждающее сообщение в *sys.stderr*; однако возможно, что пользователь указал превращать предупреждения в ошибки, и в этом случае они возбудят исключение. Также возможно, что функции возбуждают исключение из-за проблемы с механизмом предупреждений. Возвращаемое значение – `0`, если исключение не возбуждено, или `-1`, если исключение возбуждено. (Невозможно определить, было ли предупреждение фактически напечатано или какова причина исключения; это сделано намеренно.) Если исключение возбуждено, вызывающий код должен выполнить обычную обработку исключений (например, [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) принадлежащие ссылки и вернуть значение ошибки).292293#### `int PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)`294295*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*296297Выдает предупреждающее сообщение. Аргумент *category* – это категория предупреждения (см. ниже) или `NULL`; аргумент *message* – это строка в кодировке UTF-8. *stack\_level* – положительное число, задающее количество фреймов стека; предупреждение будет выдано от текущей выполняемой строки кода в этом фрейме стека. *stack\_level*, равный 1, – это функция, вызывающая [`PyErr_WarnEx()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WarnEx), 2 – функция над ней, и так далее.298299Категории предупреждений должны быть подклассами [`PyExc_Warning`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_Warning); `PyExc_Warning` является подклассом [`PyExc_Exception`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_Exception); категория предупреждения по умолчанию – [`PyExc_RuntimeWarning`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_RuntimeWarning). Стандартные категории предупреждений Python доступны как глобальные переменные, названия которых перечислены в [Типы предупреждений](https://python-all.ru/3.13/c-api/exceptions.html#standardwarningcategories).300301Информацию об управлении предупреждениями см. в документации модуля [`warnings`](https://python-all.ru/3.13/library/warnings.html#module-warnings) и опции [`-W`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-W) в документации командной строки. API для управления предупреждениями на C не существует.302303#### `int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)`304305Выдаёт предупреждение с явным контролем всех его атрибутов. Это простая обёртка вокруг функции Python [`warnings.warn_explicit()`](https://python-all.ru/3.13/library/warnings.html#warnings.warn_explicit); за подробностями обращайтесь к её документации. Аргументы *module* и *registry* могут быть установлены в `NULL`, чтобы получить описанный там эффект по умолчанию.306307Добавлено в версии 3.4.308309#### `int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)`310311*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*312313Аналогично [`PyErr_WarnExplicitObject()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WarnExplicitObject), за исключением того, что *message* и *module* являются строками в кодировке UTF-8, а *filename* декодируется из [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.13/glossary.html#term-filesystem-encoding-and-error-handler).314315#### `int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...)`316317*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*318319Функция аналогична [`PyErr_WarnEx()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WarnEx), но использует [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat) для форматирования предупреждающего сообщения. *format* – это строка в кодировке ASCII.320321Добавлено в версии 3.2.322323#### `int PyErr_WarnExplicitFormat(PyObject *category, const char *filename, int lineno, const char *module, PyObject *registry, const char *format, ...)`324325Аналогично [`PyErr_WarnExplicit()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WarnExplicit), но использует [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat) для форматирования предупреждающего сообщения. *format* – это строка в кодировке ASCII.326327Добавлено в версии 3.2.328329#### `int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...)`330331*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.6.*332333Функция аналогична [`PyErr_WarnFormat()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_WarnFormat), но *category* равен [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning), и она передаёт *source* в `warnings.WarningMessage`.334335Добавлено в версии 3.6.336337## Опрос индикатора ошибки338339#### `PyObject *PyErr_Occurred()`340341*Возвращаемое значение: заимствованная ссылка.*342343*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*344345Проверяет, установлен ли индикатор ошибки. Если установлен, возвращает *тип* исключения (первый аргумент последнего вызова одной из функций `PyErr_Set*` или [`PyErr_Restore()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_Restore)). Если не установлен, возвращает `NULL`. Вы не владеете ссылкой на возвращаемое значение, поэтому вам не нужно [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) его.346347Вызывающий код должен удерживать GIL.348349> **Примечание**350>351> Не сравнивайте возвращаемое значение с конкретным исключением; используйте вместо этого [`PyErr_ExceptionMatches()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_ExceptionMatches), как показано ниже. (Сравнение может легко не сработать, так как исключение может быть экземпляром, а не классом (в случае классового исключения) или подклассом ожидаемого исключения.)352353#### `int PyErr_ExceptionMatches(PyObject *exc)`354355*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*356357Эквивалентно `PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)`. Эту функцию следует вызывать только тогда, когда исключение действительно установлено; при отсутствии возбуждённого исключения произойдёт нарушение доступа к памяти.358359#### `int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)`360361*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*362363Возвращает истину, если *заданное* исключение соответствует типу исключения в *exc*. Если *exc* – объект класса, также возвращает истину, когда *given* является экземпляром подкласса. Если *exc* – кортеж, производится поиск соответствия среди всех типов исключений в кортеже (и рекурсивно во вложенных кортежах).364365#### `PyObject *PyErr_GetRaisedException(void)`366367*Возвращаемое значение: новая ссылка.*368369*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) с версии 3.12.*370371Возвращает исключение, которое в данный момент возбуждается, одновременно очищая индикатор ошибки. Возвращает `NULL`, если индикатор ошибки не установлен.372373Эта функция используется кодом, которому необходимо перехватывать исключения, или кодом, которому нужно временно сохранять и восстанавливать индикатор ошибки.374375Например:376377```c378{379 PyObject *exc = PyErr_GetRaisedException();380381 /* ... код, который может вызвать другие ошибки ... */382383 PyErr_SetRaisedException(exc);384}385```386387> **См. также**388>389> [`PyErr_GetHandledException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetHandledException), чтобы сохранить исключение, которое в данный момент обрабатывается.390391Добавлено в версии 3.12.392393#### `void PyErr_SetRaisedException(PyObject *exc)`394395*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*396397Устанавливает *exc* в качестве текущего возбуждаемого исключения, очищая существующее исключение, если оно было установлено.398399> **Предупреждение**400>401> Этот вызов «[крадёт](https://python-all.ru/3.13/glossary.html#term-steal)» ссылку на *exc*, который должен быть корректным исключением.402403Добавлено в версии 3.12.404405#### `void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)`406407*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*408409Устарело с версии 3.12: Используйте [`PyErr_GetRaisedException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetRaisedException).410411Извлекает индикатор ошибки в три переменные, чьи адреса передаются. Если индикатор ошибки не установлен, устанавливает все три переменные в `NULL`. Если он установлен, он будет очищен, и вы получаете владение ссылкой на каждый извлеченный объект. Объекты value и traceback могут иметь значение `NULL`, даже если объект type – нет.412413> **Примечание**414>415> Эта функция обычно используется только устаревшим кодом, которому нужно перехватывать исключения или временно сохранять и восстанавливать индикатор ошибки.416>417> Например:418>419> ```c420> {421> PyObject *type, *value, *traceback;422> PyErr_Fetch(&type, &value, &traceback);423>424> /* ... код, который может вызвать другие ошибки ... */425>426> PyErr_Restore(type, value, traceback);427> }428> ```429430#### `void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)`431432*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*433434Устарело с версии 3.12: Используйте [`PyErr_SetRaisedException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetRaisedException).435436Устанавливает индикатор ошибки из трех объектов: *type*, *value* и *traceback*, очищая существующее исключение, если оно установлено. Если объекты равны `NULL`, индикатор ошибки очищается. Не передавайте `NULL` тип и не-`NULL` значение или traceback. Тип исключения должен быть классом. Не передавайте недопустимый тип или значение исключения. (Нарушение этих правил приведет к скрытым проблемам в дальнейшем.) Этот вызов забирает ссылку на каждый объект: вы должны владеть ссылкой на каждый объект до вызова, а после вызова вы больше не владеете этими ссылками. (Если вы этого не понимаете, не используйте эту функцию. Я вас предупредил.)437438> **Примечание**439>440> Эта функция обычно используется только устаревшим кодом, которому нужно временно сохранять и восстанавливать индикатор ошибки. Используйте [`PyErr_Fetch()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_Fetch), чтобы сохранить текущий индикатор ошибки.441442#### `void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)`443444*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*445446Устарело с версии 3.12: Используйте [`PyErr_GetRaisedException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetRaisedException) вместо этого, чтобы избежать возможной денормализации.447448При определенных обстоятельствах значения, возвращаемые [`PyErr_Fetch()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_Fetch) ниже, могут быть «ненормализованными», то есть `*exc` является объектом класса, но `*val` не является экземпляром того же класса. В этом случае данная функция может использоваться для создания экземпляра класса. Если значения уже нормализованы, ничего не происходит. Отложенная нормализация реализована для повышения производительности.449450> **Примечание**451>452> Эта функция *не* неявно устанавливает атрибут [`__traceback__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__traceback__) у значения исключения. Если требуется правильно установить traceback, необходим следующий дополнительный фрагмент:453>454> ```c455> if (tb != NULL) {456> PyException_SetTraceback(val, tb);457> }458> ```459460#### `PyObject *PyErr_GetHandledException(void)`461462*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*463464Извлекает активный экземпляр исключения, как возвращаемый [`sys.exception()`](https://python-all.ru/3.13/library/sys.html#sys.exception). Это относится к исключению, которое *уже было перехвачено*, а не к только что возбужденному. Возвращает новую ссылку на исключение или `NULL`. Не изменяет состояние исключения интерпретатора.465466> **Примечание**467>468> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_SetHandledException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetHandledException), чтобы восстановить или очистить состояние исключения.469470Добавлено в версии 3.12.471472#### `void PyErr_SetHandledException(PyObject *exc)`473474*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*475476Устанавливает активное исключение, как известно из `sys.exception()`. Это относится к исключению, которое *уже было перехвачено*, а не к только что возбужденному. Чтобы очистить состояние исключения, передайте `NULL`.477478> **Примечание**479>480> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_GetHandledException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetHandledException), чтобы получить состояние исключения.481482Добавлено в версии 3.12.483484#### `void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)`485486*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.*487488Извлекает представление информации об исключении в старом стиле, как известно из [`sys.exc_info()`](https://python-all.ru/3.13/library/sys.html#sys.exc_info). Это относится к исключению, которое *уже было перехвачено*, а не к только что возбужденному. Возвращает новые ссылки на три объекта, каждый из которых может быть `NULL`. Не изменяет состояние информации об исключении. Эта функция сохраняется для обратной совместимости. Предпочтительнее использовать [`PyErr_GetHandledException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetHandledException).489490> **Примечание**491>492> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_SetExcInfo()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetExcInfo), чтобы восстановить или очистить состояние исключения.493494Добавлено в версии 3.3.495496#### `void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)`497498*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.*499500Устанавливает информацию об исключении, как известно из `sys.exc_info()`. Это относится к исключению, которое *уже было перехвачено*, а не к только что возбужденному. Эта функция «[похищает](https://python-all.ru/3.13/glossary.html#term-steal)» ссылки на аргументы. Чтобы очистить состояние исключения, передайте `NULL` для всех трех аргументов. Эта функция сохраняется для обратной совместимости. Предпочтительнее использовать [`PyErr_SetHandledException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetHandledException).501502> **Примечание**503>504> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_GetExcInfo()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_GetExcInfo), чтобы прочитать состояние исключения.505506Добавлено в версии 3.3.507508Изменено в версии 3.11: Аргументы `type` и `traceback` больше не используются и могут быть NULL. Интерпретатор теперь извлекает их из экземпляра исключения (аргумент `value`). Функция по-прежнему «[похищает](https://python-all.ru/3.13/glossary.html#term-steal)» ссылки всех трех аргументов.509510## Обработка сигналов511512#### `int PyErr_CheckSignals()`513514*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*515516Обрабатывает внешние прерывания, такие как сигналы или активация отладчика, обработка которых была отложена до момента, когда безопасно выполнять код Python и/или возбуждать исключения.517518Например, нажатие `Ctrl`-`C` заставляет терминал отправить сигнал [`signal.SIGINT`](https://python-all.ru/3.13/library/signal.html#signal.SIGINT). Эта функция выполняет соответствующий обработчик сигнала Python, который по умолчанию возбуждает исключение [`KeyboardInterrupt`](https://python-all.ru/3.13/library/exceptions.html#KeyboardInterrupt).519520`PyErr_CheckSignals()` должна вызываться длительно выполняющимся кодом на C достаточно часто, чтобы реакция казалась человеку мгновенной.521522Обработчики, вызываемые этой функцией в настоящее время, включают:523524- Обработчики сигналов, включая функции Python, зарегистрированные с помощью модуля [`signal`](https://python-all.ru/3.13/library/signal.html#module-signal).525526 Обработчики сигналов выполняются только в главном потоке главного интерпретатора.527528 (Именно поэтому функция получила такое название: изначально сигналы были единственным способом прервать интерпретатор.)529- Запуск сборщика мусора, если необходимо.530531Если какой-либо обработчик возбуждает исключение, немедленно возвращает `-1` с этим установленным исключением. Оставшиеся прерывания обрабатываются при следующем вызове [`PyErr_CheckSignals()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_CheckSignals), если это уместно.532533Если все обработчики завершились успешно или обработчиков для запуска нет, возвращает `0`.534535Изменено в версии 3.12: Теперь эта функция может вызывать сборщик мусора.536537#### `void PyErr_SetInterrupt()`538539*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*540541Имитирует эффект прибытия сигнала `SIGINT`. Это эквивалентно `PyErr_SetInterruptEx(SIGINT)`.542543> **Примечание**544>545> Эта функция безопасна для асинхронных сигналов. Её можно вызывать без [GIL](https://python-all.ru/3.13/glossary.html#term-GIL) и из обработчика сигналов C.546547#### `int PyErr_SetInterruptEx(int signum)`548549*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.*550551Имитирует эффект прибытия сигнала. При следующем вызове [`PyErr_CheckSignals()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_CheckSignals) будет вызван обработчик сигнала Python для заданного номера сигнала.552553Эта функция может вызываться кодом на C, который устанавливает собственную обработку сигналов и хочет, чтобы обработчики сигналов Python вызывались должным образом при запросе прерывания (например, когда пользователь нажимает Ctrl-C для прерывания операции).554555Если заданный сигнал не обрабатывается Python (он был установлен в [`signal.SIG_DFL`](https://python-all.ru/3.13/library/signal.html#signal.SIG_DFL) или [`signal.SIG_IGN`](https://python-all.ru/3.13/library/signal.html#signal.SIG_IGN)), он будет проигнорирован.556557Если *signum* выходит за допустимый диапазон номеров сигналов, возвращается `-1`. В противном случае возвращается `0`. Эта функция никогда не изменяет индикатор ошибки.558559> **Примечание**560>561> Эта функция безопасна для асинхронных сигналов. Её можно вызывать без [GIL](https://python-all.ru/3.13/glossary.html#term-GIL) и из обработчика сигналов C.562563Добавлено в версии 3.10.564565#### `int PySignal_SetWakeupFd(int fd)`566567Эта вспомогательная функция задаёт файловый дескриптор, в который при получении сигнала записывается номер сигнала в виде одного байта. *fd* должен быть неблокирующим. Функция возвращает предыдущий такой файловый дескриптор.568569Значение `-1` отключает эту возможность; это начальное состояние. Это эквивалентно [`signal.set_wakeup_fd()`](https://python-all.ru/3.13/library/signal.html#signal.set_wakeup_fd) в Python, но без проверки ошибок. *fd* должен быть корректным файловым дескриптором. Функцию следует вызывать только из главного потока.570571Изменено в версии 3.5: В Windows функция теперь также поддерживает дескрипторы сокетов.572573## Классы исключений574575#### `PyObject *PyErr_NewException(const char *name, PyObject *base, PyObject *dict)`576577*Возвращаемое значение: новая ссылка.*578579*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*580581Эта вспомогательная функция создаёт и возвращает новый класс исключения. Аргумент *name* должен быть именем нового исключения – строкой C вида `module.classname`. Аргументы *base* и *dict* обычно равны `NULL`. При этом создаётся класс, производный от [`Exception`](https://python-all.ru/3.13/library/exceptions.html#Exception) (доступен в C как [`PyExc_Exception`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_Exception)).582583Атрибут [`__module__`](https://python-all.ru/3.13/reference/datamodel.html#type.__module__) нового класса устанавливается в первую часть (до последней точки) аргумента *name*, а имя класса – в последнюю часть (после последней точки). Аргумент *base* можно использовать для указания альтернативных базовых классов; это может быть как один класс, так и кортеж классов. Аргумент *dict* можно использовать для указания словаря переменных и методов класса.584585#### `PyObject *PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)`586587*Возвращаемое значение: новая ссылка.*588589*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*590591То же, что и [`PyErr_NewException()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_NewException), за исключением того, что новому классу исключения можно легко задать докстринг: если *doc* не `NULL`, он будет использоваться в качестве докстринга класса исключения.592593Добавлено в версии 3.2.594595#### `int PyExceptionClass_Check(PyObject *ob)`596597Возвращает ненулевое значение, если *ob* является классом исключения, и ноль в противном случае. Эта функция всегда завершается успешно.598599#### `const char *PyExceptionClass_Name(PyObject *ob)`600601*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) с версии 3.8.*602603Возвращает [`tp_name`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_name) класса исключения *ob*.604605## Объекты исключений606607#### `int PyExceptionInstance_Check(PyObject *op)`608609Возвращает true, если *op* является экземпляром [`BaseException`](https://python-all.ru/3.13/library/exceptions.html#BaseException), и false в противном случае. Эта функция всегда завершается успешно.610611#### `PyExceptionInstance_Class(op)`612613Эквивалентно [`Py_TYPE(op)`](https://python-all.ru/3.13/c-api/structures.html#c.Py_TYPE).614615#### `PyObject *PyException_GetTraceback(PyObject *ex)`616617*Возвращаемое значение: новая ссылка.*618619*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*620621Возвращает traceback, связанный с исключением, в виде новой ссылки, доступной из Python через атрибут [`__traceback__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__traceback__). Если traceback не связан, возвращает `NULL`.622623#### `int PyException_SetTraceback(PyObject *ex, PyObject *tb)`624625*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*626627Устанавливает traceback, связанный с исключением, в значение *tb*. Используйте `Py_None`, чтобы очистить его.628629#### `PyObject *PyException_GetContext(PyObject *ex)`630631*Возвращаемое значение: новая ссылка.*632633*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*634635Возвращает контекст (другой экземпляр исключения, при обработке которого было возбуждено *ex*), связанный с исключением, в виде новой ссылки, доступной из Python через атрибут [`__context__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__context__). Если контекст не связан, возвращает `NULL`.636637#### `void PyException_SetContext(PyObject *ex, PyObject *ctx)`638639*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*640641Устанавливает контекст, связанный с исключением, в значение *ctx*. Используйте `NULL`, чтобы очистить его. Проверка типа, чтобы убедиться, что *ctx* является экземпляром исключения, не выполняется. Эта функция «[забирает](https://python-all.ru/3.13/glossary.html#term-steal)» ссылку на *ctx*.642643#### `PyObject *PyException_GetCause(PyObject *ex)`644645*Возвращаемое значение: новая ссылка.*646647*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*648649Возвращает причину (экземпляр исключения или `None`, установленную с помощью `raise ... from ...`), связанную с исключением, в виде новой ссылки, доступной из Python через атрибут [`__cause__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__cause__).650651#### `void PyException_SetCause(PyObject *ex, PyObject *cause)`652653*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*654655Устанавливает причину, связанную с исключением, в значение *cause*. Используйте `NULL`, чтобы очистить её. Проверка типа, чтобы убедиться, что *cause* является либо экземпляром исключения, либо `None`, не выполняется. Эта функция «[забирает](https://python-all.ru/3.13/glossary.html#term-steal)» ссылку на *cause*.656657Атрибут [`__suppress_context__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__suppress_context__) неявно устанавливается в значение `True` этой функцией.658659#### `PyObject *PyException_GetArgs(PyObject *ex)`660661*Возвращаемое значение: новая ссылка.*662663*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) с версии 3.12.*664665Возвращает [`args`](https://python-all.ru/3.13/library/exceptions.html#BaseException.args) исключения *ex*.666667#### `void PyException_SetArgs(PyObject *ex, PyObject *args)`668669*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*670671Устанавливает [`args`](https://python-all.ru/3.13/library/exceptions.html#BaseException.args) исключения *ex* в значение *args*.672673#### `PyObject *PyUnstable_Exc_PrepReraiseStar(PyObject *orig, PyObject *excs)`674675> *Это [нестабильное API](https://python-all.ru/3.13/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*676677Реализует часть реализации интерпретатором конструкции `except*`. *orig* – это исходное исключение, которое было перехвачено, а *excs* – это список исключений, которые необходимо возбудить. Этот список содержит необработанную часть *orig* (если есть), а также исключения, возбуждённые из предложений `except*` (поэтому их traceback отличается от traceback *orig*), и те, которые были повторно возбуждены (и имеют тот же traceback, что и *orig*). Возвращает [`ExceptionGroup`](https://python-all.ru/3.13/library/exceptions.html#ExceptionGroup), который нужно повторно возбудить в конце, или `None`, если ничего повторно возбуждать не нужно.678679Добавлено в версии 3.12.680681## Объекты исключений Unicode682683Следующие функции используются для создания и изменения исключений Unicode из C.684685#### `PyObject *PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`686687*Возвращаемое значение: новая ссылка.*688689*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*690691Создаёт объект [`UnicodeDecodeError`](https://python-all.ru/3.13/library/exceptions.html#UnicodeDecodeError) с атрибутами *encoding*, *object*, *length*, *start*, *end* и *reason*. *encoding* и *reason* – это строки в кодировке UTF-8.692693#### `PyObject *PyUnicodeDecodeError_GetEncoding(PyObject *exc)`694695#### `PyObject *PyUnicodeEncodeError_GetEncoding(PyObject *exc)`696697*Возвращаемое значение: новая ссылка.*698699*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*700701Возвращает атрибут *encoding* указанного объекта исключения.702703#### `PyObject *PyUnicodeDecodeError_GetObject(PyObject *exc)`704705#### `PyObject *PyUnicodeEncodeError_GetObject(PyObject *exc)`706707#### `PyObject *PyUnicodeTranslateError_GetObject(PyObject *exc)`708709*Возвращаемое значение: новая ссылка.*710711*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*712713Возвращает атрибут *object* указанного объекта исключения.714715#### `int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)`716717#### `int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)`718719#### `int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)`720721*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*722723Получает атрибут *start* указанного объекта исключения и помещает его в *\*start*. *start* не должен быть равен `NULL`. Возвращает `0` в случае успеха, `-1` при ошибке.724725#### `int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)`726727#### `int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)`728729#### `int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)`730731*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*732733Устанавливает атрибут *start* указанного объекта исключения в значение *start*. Возвращает `0` при успехе, `-1` при ошибке.734735#### `int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`736737#### `int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`738739#### `int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)`740741*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*742743Получает атрибут *end* указанного объекта исключения и помещает его в *\*end*. *end* не должен быть равен `NULL`. Возвращает `0` в случае успеха, `-1` при ошибке.744745#### `int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)`746747#### `int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)`748749#### `int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)`750751*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*752753Устанавливает атрибут *end* указанного объекта исключения в *end*. Возвращает `0` в случае успеха, `-1` при ошибке.754755#### `PyObject *PyUnicodeDecodeError_GetReason(PyObject *exc)`756757#### `PyObject *PyUnicodeEncodeError_GetReason(PyObject *exc)`758759#### `PyObject *PyUnicodeTranslateError_GetReason(PyObject *exc)`760761*Возвращаемое значение: новая ссылка.*762763*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*764765Возвращает атрибут *reason* указанного объекта исключения.766767#### `int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)`768769#### `int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)`770771#### `int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)`772773*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*774775Устанавливает атрибут *reason* указанного объекта исключения в значение *reason*. Возвращает `0` в случае успеха, `-1` в случае ошибки.776777## Управление рекурсией778779Эти две функции предоставляют способ безопасно выполнять рекурсивные вызовы на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает свою глубину рекурсии). Они также не нужны для реализаций *tp\_call*, поскольку [протокол вызова](https://python-all.ru/3.13/c-api/call.html#call) берёт на себя обработку рекурсии.780781#### `int Py_EnterRecursiveCall(const char *where)`782783*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.9.*784785Отмечает точку, в которой будет выполнен рекурсивный вызов на уровне C.786787Если `USE_STACKCHECK` определён, эта функция проверяет, не произошло ли переполнения стека ОС с помощью [`PyOS_CheckStack()`](https://python-all.ru/3.13/c-api/sys.html#c.PyOS_CheckStack). Если это так, она устанавливает [`MemoryError`](https://python-all.ru/3.13/library/exceptions.html#MemoryError) и возвращает ненулевое значение.788789Затем функция проверяет, достигнут ли предел рекурсии. Если это так, устанавливается [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError) и возвращается ненулевое значение. В противном случае возвращается ноль.790791*where* должна быть строкой в кодировке UTF-8, например `" in instance check"`, для добавления к сообщению [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError), вызванному пределом глубины рекурсии.792793Изменено в версии 3.9: Эта функция теперь также доступна в [limited API](https://python-all.ru/3.13/c-api/stable.html#limited-c-api).794795#### `void Py_LeaveRecursiveCall(void)`796797*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.9.*798799Завершает [`Py_EnterRecursiveCall()`](https://python-all.ru/3.13/c-api/exceptions.html#c.Py_EnterRecursiveCall). Должна вызываться один раз для каждого *успешного* вызова `Py_EnterRecursiveCall()`.800801Изменено в версии 3.9: Эта функция теперь также доступна в [limited API](https://python-all.ru/3.13/c-api/stable.html#limited-c-api).802803Для правильной реализации [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) для контейнерных типов требуется специальная обработка рекурсии. В дополнение к защите стека, `tp_repr` также необходимо отслеживать объекты для предотвращения циклов. Следующие две функции облегчают эту функциональность. По сути, это эквивалент [`reprlib.recursive_repr()`](https://python-all.ru/3.13/library/reprlib.html#reprlib.recursive_repr) на C.804805#### `int Py_ReprEnter(PyObject *object)`806807*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*808809Вызывается в начале реализации [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) для обнаружения циклов.810811Если объект уже был обработан, функция возвращает положительное целое число. В этом случае реализация [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) должна вернуть строковый объект, указывающий на цикл. Например, объекты [`dict`](https://python-all.ru/3.13/library/stdtypes.html#dict) возвращают `{...}`, а объекты [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) возвращают `[...]`.812813Функция возвращает отрицательное целое число, если достигнут предел рекурсии. В этом случае реализация [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) обычно должна возвращать `NULL`.814815В противном случае функция возвращает ноль, и реализация [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) может продолжить работу в обычном режиме.816817#### `void Py_ReprLeave(PyObject *object)`818819*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*820821Завершает [`Py_ReprEnter()`](https://python-all.ru/3.13/c-api/exceptions.html#c.Py_ReprEnter). Должна вызываться один раз для каждого вызова `Py_ReprEnter()`, которая возвращает ноль.822823#### `int Py_GetRecursionLimit(void)`824825*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*826827Возвращает предел рекурсии для текущего интерпретатора. Его можно установить с помощью [`Py_SetRecursionLimit()`](https://python-all.ru/3.13/c-api/exceptions.html#c.Py_SetRecursionLimit). Предел рекурсии предотвращает бесконечный рост стека интерпретатора Python.828829Эта функция не может завершиться ошибкой, и вызывающий код должен удерживать [GIL](https://python-all.ru/3.13/glossary.html#term-GIL).830831> **См. также**832>833> [`sys.getrecursionlimit()`](https://python-all.ru/3.13/library/sys.html#sys.getrecursionlimit)834835#### `void Py_SetRecursionLimit(int new_limit)`836837*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*838839Устанавливает предел рекурсии для текущего интерпретатора.840841Эта функция не может завершиться ошибкой, и вызывающий код должен удерживать [GIL](https://python-all.ru/3.13/glossary.html#term-GIL).842843> **См. также**844>845> [`sys.setrecursionlimit()`](https://python-all.ru/3.13/library/sys.html#sys.setrecursionlimit)846847## Типы исключений и предупреждений848849Все стандартные исключения Python и категории предупреждений доступны в виде глобальных переменных, имена которых образованы `PyExc_` с добавлением имени исключения Python. Эти переменные имеют тип [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject)\*; все они являются объектами-классами.850851Для полноты картины – вот все переменные:852853### Типы исключений854855| Имя на C | Имя в Python |856| --- | --- |857| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BaseException *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`BaseException`](https://python-all.ru/3.13/library/exceptions.html#BaseException) |858| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BaseExceptionGroup *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.* | [`BaseExceptionGroup`](https://python-all.ru/3.13/library/exceptions.html#BaseExceptionGroup) |859| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_Exception *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`Exception`](https://python-all.ru/3.13/library/exceptions.html#Exception) |860| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ArithmeticError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ArithmeticError`](https://python-all.ru/3.13/library/exceptions.html#ArithmeticError) |861| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_AssertionError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`AssertionError`](https://python-all.ru/3.13/library/exceptions.html#AssertionError) |862| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_AttributeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`AttributeError`](https://python-all.ru/3.13/library/exceptions.html#AttributeError) |863| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BlockingIOError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`BlockingIOError`](https://python-all.ru/3.13/library/exceptions.html#BlockingIOError) |864| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BrokenPipeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`BrokenPipeError`](https://python-all.ru/3.13/library/exceptions.html#BrokenPipeError) |865| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BufferError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`BufferError`](https://python-all.ru/3.13/library/exceptions.html#BufferError) |866| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ChildProcessError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ChildProcessError`](https://python-all.ru/3.13/library/exceptions.html#ChildProcessError) |867| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ConnectionAbortedError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ConnectionAbortedError`](https://python-all.ru/3.13/library/exceptions.html#ConnectionAbortedError) |868| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ConnectionError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ConnectionError`](https://python-all.ru/3.13/library/exceptions.html#ConnectionError) |869| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ConnectionRefusedError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ConnectionRefusedError`](https://python-all.ru/3.13/library/exceptions.html#ConnectionRefusedError) |870| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ConnectionResetError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ConnectionResetError`](https://python-all.ru/3.13/library/exceptions.html#ConnectionResetError) |871| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_EOFError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`EOFError`](https://python-all.ru/3.13/library/exceptions.html#EOFError) |872| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_FileExistsError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError) |873| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_FileNotFoundError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError) |874| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_FloatingPointError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`FloatingPointError`](https://python-all.ru/3.13/library/exceptions.html#FloatingPointError) |875| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_GeneratorExit *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`GeneratorExit`](https://python-all.ru/3.13/library/exceptions.html#GeneratorExit) |876| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ImportError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) |877| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_IndentationError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`IndentationError`](https://python-all.ru/3.13/library/exceptions.html#IndentationError) |878| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_IndexError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`IndexError`](https://python-all.ru/3.13/library/exceptions.html#IndexError) |879| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_InterruptedError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`InterruptedError`](https://python-all.ru/3.13/library/exceptions.html#InterruptedError) |880| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_IsADirectoryError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`IsADirectoryError`](https://python-all.ru/3.13/library/exceptions.html#IsADirectoryError) |881| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_KeyError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) |882| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_KeyboardInterrupt *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`KeyboardInterrupt`](https://python-all.ru/3.13/library/exceptions.html#KeyboardInterrupt) |883| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_LookupError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`LookupError`](https://python-all.ru/3.13/library/exceptions.html#LookupError) |884| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_MemoryError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`MemoryError`](https://python-all.ru/3.13/library/exceptions.html#MemoryError) |885| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ModuleNotFoundError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.6.* | [`ModuleNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#ModuleNotFoundError) |886| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_NameError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`NameError`](https://python-all.ru/3.13/library/exceptions.html#NameError) |887| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_NotADirectoryError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`NotADirectoryError`](https://python-all.ru/3.13/library/exceptions.html#NotADirectoryError) |888| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_NotImplementedError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError) |889| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_OSError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) |890| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_OverflowError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`OverflowError`](https://python-all.ru/3.13/library/exceptions.html#OverflowError) |891| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_PermissionError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`PermissionError`](https://python-all.ru/3.13/library/exceptions.html#PermissionError) |892| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ProcessLookupError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ProcessLookupError`](https://python-all.ru/3.13/library/exceptions.html#ProcessLookupError) |893| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_PythonFinalizationError | [`PythonFinalizationError`](https://python-all.ru/3.13/library/exceptions.html#PythonFinalizationError) |894| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_RecursionError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError) |895| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ReferenceError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ReferenceError`](https://python-all.ru/3.13/library/exceptions.html#ReferenceError) |896| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_RuntimeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`RuntimeError`](https://python-all.ru/3.13/library/exceptions.html#RuntimeError) |897| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_StopAsyncIteration *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`StopAsyncIteration`](https://python-all.ru/3.13/library/exceptions.html#StopAsyncIteration) |898| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_StopIteration *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`StopIteration`](https://python-all.ru/3.13/library/exceptions.html#StopIteration) |899| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_SyntaxError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) |900| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_SystemError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`SystemError`](https://python-all.ru/3.13/library/exceptions.html#SystemError) |901| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_SystemExit *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`SystemExit`](https://python-all.ru/3.13/library/exceptions.html#SystemExit) |902| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_TabError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`TabError`](https://python-all.ru/3.13/library/exceptions.html#TabError) |903| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_TimeoutError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`TimeoutError`](https://python-all.ru/3.13/library/exceptions.html#TimeoutError) |904| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_TypeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) |905| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnboundLocalError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnboundLocalError`](https://python-all.ru/3.13/library/exceptions.html#UnboundLocalError) |906| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnicodeDecodeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnicodeDecodeError`](https://python-all.ru/3.13/library/exceptions.html#UnicodeDecodeError) |907| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnicodeEncodeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnicodeEncodeError`](https://python-all.ru/3.13/library/exceptions.html#UnicodeEncodeError) |908| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnicodeError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnicodeError`](https://python-all.ru/3.13/library/exceptions.html#UnicodeError) |909| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnicodeTranslateError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnicodeTranslateError`](https://python-all.ru/3.13/library/exceptions.html#UnicodeTranslateError) |910| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ValueError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) |911| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ZeroDivisionError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ZeroDivisionError`](https://python-all.ru/3.13/library/exceptions.html#ZeroDivisionError) |912913Добавлено в версии 3.3: [`PyExc_BlockingIOError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_BlockingIOError), [`PyExc_BrokenPipeError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_BrokenPipeError), [`PyExc_ChildProcessError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ChildProcessError), [`PyExc_ConnectionError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ConnectionError), [`PyExc_ConnectionAbortedError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ConnectionAbortedError), [`PyExc_ConnectionRefusedError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ConnectionRefusedError), [`PyExc_ConnectionResetError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ConnectionResetError), [`PyExc_FileExistsError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_FileExistsError), [`PyExc_FileNotFoundError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_FileNotFoundError), [`PyExc_InterruptedError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_InterruptedError), [`PyExc_IsADirectoryError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_IsADirectoryError), [`PyExc_NotADirectoryError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_NotADirectoryError), [`PyExc_PermissionError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_PermissionError), [`PyExc_ProcessLookupError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ProcessLookupError) и [`PyExc_TimeoutError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_TimeoutError) были введены в соответствии с [**PEP 3151**](https://python-all.ru/3.13/c-api/exceptions.html).914915Добавлено в версии 3.5: [`PyExc_StopAsyncIteration`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_StopAsyncIteration) и [`PyExc_RecursionError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_RecursionError).916917Добавлено в версии 3.6: [`PyExc_ModuleNotFoundError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ModuleNotFoundError).918919Добавлено в версии 3.11: [`PyExc_BaseExceptionGroup`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_BaseExceptionGroup).920921### Псевдонимы OSError922923Ниже приведены совместимые псевдонимы для [`PyExc_OSError`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_OSError).924925Изменено в версии 3.3: Раньше эти псевдонимы были отдельными типами исключений.926927| Имя на C | Имя в Python | Примечания |928| --- | --- | --- |929| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_EnvironmentError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) | |930| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_IOError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) | |931| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_WindowsError *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) в Windows начиная с версии 3.7.* | [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) | [\[win\]](https://python-all.ru/3.13/c-api/exceptions.html#win) |932933Примечания:934935\[[win](https://python-all.ru/3.13/c-api/exceptions.html#id1)\]936937`PyExc_WindowsError` определён только в Windows; код, который использует это, следует защищать, проверяя, что определён препроцессорный макрос `MS_WINDOWS`.938939### Типы предупреждений940941| Имя на C | Имя в Python |942| --- | --- |943| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_Warning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`Warning`](https://python-all.ru/3.13/library/exceptions.html#Warning) |944| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_BytesWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`BytesWarning`](https://python-all.ru/3.13/library/exceptions.html#BytesWarning) |945| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_DeprecationWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) |946| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_EncodingWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.* | [`EncodingWarning`](https://python-all.ru/3.13/library/exceptions.html#EncodingWarning) |947| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_FutureWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`FutureWarning`](https://python-all.ru/3.13/library/exceptions.html#FutureWarning) |948| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ImportWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning) |949| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_PendingDeprecationWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`PendingDeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#PendingDeprecationWarning) |950| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_ResourceWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.7.* | [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning) |951| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_RuntimeWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`RuntimeWarning`](https://python-all.ru/3.13/library/exceptions.html#RuntimeWarning) |952| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_SyntaxWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`SyntaxWarning`](https://python-all.ru/3.13/library/exceptions.html#SyntaxWarning) |953| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UnicodeWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UnicodeWarning`](https://python-all.ru/3.13/library/exceptions.html#UnicodeWarning) |954| [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \*PyExc\_UserWarning *Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).* | [`UserWarning`](https://python-all.ru/3.13/library/exceptions.html#UserWarning) |955956Добавлено в версии 3.2: [`PyExc_ResourceWarning`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_ResourceWarning).957958Добавлено в версии 3.10: [`PyExc_EncodingWarning`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyExc_EncodingWarning).959960## Трассировки961962#### `PyTypeObject PyTraceBack_Type`963964*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*965966Объект типа для объектов трассировки. Он доступен как [`types.TracebackType`](https://python-all.ru/3.13/library/types.html#types.TracebackType) в слое Python.967968#### `int PyTraceBack_Check(PyObject *op)`969970Возвращает true, если *op* является объектом трассировки, и false в противном случае. Эта функция не учитывает подтипы.971972#### `int PyTraceBack_Here(PyFrameObject *f)`973974*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*975976Заменяет атрибут [`__traceback__`](https://python-all.ru/3.13/library/exceptions.html#BaseException.__traceback__) текущего исключения новой трассировкой, добавляя *f* в начало существующей цепочки.977978Вызов этой функции без установленного исключения является неопределённым поведением.979980Эта функция возвращает `0` в случае успеха и `-1` с установленным исключением в случае неудачи.981982#### `int PyTraceBack_Print(PyObject *tb, PyObject *f)`983984*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*985986Записывает трассировку *tb* в файл *f*.987988Эта функция возвращает `0` в случае успеха и `-1` с установленным исключением в случае неудачи.989