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

exceptions.md

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

1> **Источник:** https://python-all.ru/3.9/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.9/library/sys.html#sys.exc_info). Первый соответствует исключению, которое еще не перехвачено (и поэтому все еще распространяется), тогда как второй возвращает исключение после его перехвата (и поэтому прекратило распространение).1819## Печать и очистка2021#### `void PyErr_Clear()`2223Очищает индикатор ошибки. Если индикатор ошибки не установлен, эффекта нет.2425#### `void PyErr_PrintEx(int set_sys_last_vars)`2627Печатает стандартную трассировку в `sys.stderr` и очищает индикатор ошибки. **За исключением** случая, когда ошибка является `SystemExit`, в этом случае трассировка не печатается, и процесс Python завершится с кодом ошибки, указанным экземпляром `SystemExit`.2829Вызывайте эту функцию **только**, когда установлен индикатор ошибки. В противном случае это вызовет фатальную ошибку!3031Если *set\_sys\_last\_vars* ненулевое, переменные [`sys.last_type`](https://python-all.ru/3.9/library/sys.html#sys.last_type), [`sys.last_value`](https://python-all.ru/3.9/library/sys.html#sys.last_value) и [`sys.last_traceback`](https://python-all.ru/3.9/library/sys.html#sys.last_traceback) будут установлены в тип, значение и трассировку напечатанного исключения соответственно.3233#### `void PyErr_Print()`3435Псевдоним для `PyErr_PrintEx(1)`.3637#### `void PyErr_WriteUnraisable(PyObject *obj)`3839Вызывает [`sys.unraisablehook()`](https://python-all.ru/3.9/library/sys.html#sys.unraisablehook) с использованием текущего исключения и аргумента *obj*.4041Эта вспомогательная функция выводит предупреждающее сообщение в `sys.stderr`, когда исключение было установлено, но интерпретатор не может его фактически возбудить. Она используется, например, когда исключение возникает в методе [`__del__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__del__).4243Функция вызывается с единственным аргументом *obj*, идентифицирующим контекст, в котором возникло необрабатываемое исключение. Если возможно, в предупреждающем сообщении будет выведено представление (repr) *obj*.4445При вызове этой функции должно быть установлено исключение.4647## Возбуждение исключений4849Эти функции помогают установить индикатор ошибки текущего потока. Для удобства некоторые из этих функций всегда возвращают указатель `NULL` для использования в операторе `return`.5051#### `void PyErr_SetString(PyObject *type, const char *message)`5253Это наиболее распространённый способ установки индикатора ошибки. Первый аргумент задаёт тип исключения; обычно это одно из стандартных исключений, например `PyExc_RuntimeError`. Увеличивать его счётчик ссылок не нужно. Второй аргумент – сообщение об ошибке; оно декодируется из `'utf-8'`.5455#### `void PyErr_SetObject(PyObject *type, PyObject *value)`5657Эта функция аналогична [`PyErr_SetString()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetString), но позволяет указать произвольный объект Python для «значения» исключения.5859#### `PyObject* PyErr_Format(PyObject *exception, const char *format, ...)`6061*Возвращаемое значение: всегда NULL.*6263Эта функция устанавливает индикатор ошибки и возвращает `NULL`. *исключение* должен быть классом исключения Python. Параметры *format* и последующие помогают форматировать сообщение об ошибке; они имеют тот же смысл и значения, что и в [`PyUnicode_FromFormat()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_FromFormat). *format* – это строка в кодировке ASCII.6465#### `PyObject* PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)`6667*Возвращаемое значение: всегда NULL.*6869То же, что и [`PyErr_Format()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_Format), но принимает аргумент `va_list` вместо переменного числа аргументов.7071Новое в версии 3.5.7273#### `void PyErr_SetNone(PyObject *type)`7475Это сокращение для `PyErr_SetObject(type, Py_None)`.7677#### `int PyErr_BadArgument()`7879Это сокращение для `PyErr_SetString(PyExc_TypeError, message)`, где *message* указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном предназначено для внутреннего использования.8081#### `PyObject* PyErr_NoMemory()`8283*Возвращаемое значение: всегда NULL.*8485Это сокращение для `PyErr_SetNone(PyExc_MemoryError)`; оно возвращает `NULL`, чтобы функция выделения объекта могла написать `return PyErr_NoMemory();`, когда заканчивается память.8687#### `PyObject* PyErr_SetFromErrno(PyObject *type)`8889*Возвращаемое значение: всегда NULL.*9091Это удобная функция для возбуждения исключения, когда функция библиотеки C вернула ошибку и установила переменную C `errno`. Она создает объект кортежа, первый элемент которого – целочисленное значение `errno`, а второй – соответствующее сообщение об ошибке (полученное из `strerror()`), а затем вызывает `PyErr_SetObject(type, object)`. В Unix, когда значение `errno` равно `EINTR`, что указывает на прерванный системный вызов, эта функция вызывает [`PyErr_CheckSignals()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_CheckSignals), и если та устанавливает индикатор ошибки, оставляет его установленным на это. Функция всегда возвращает `NULL`, так что функция-обертка вокруг системного вызова может написать `return PyErr_SetFromErrno(type);`, когда системный вызов возвращает ошибку.9293#### `PyObject* PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)`9495*Возвращаемое значение: всегда NULL.*9697Аналогично [`PyErr_SetFromErrno()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetFromErrno), с тем дополнением, что если *filenameObject* не равно `NULL`, он передаётся конструктору *type* в качестве третьего параметра. В случае исключения [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) это используется для задания атрибута `filename` экземпляра исключения.9899#### `PyObject* PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)`100101*Возвращаемое значение: всегда NULL.*102103Аналогично [`PyErr_SetFromErrnoWithFilenameObject()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetFromErrnoWithFilenameObject), но принимает второй объект имени файла; используется для возбуждения ошибок, когда функция, принимающая два имени файла, завершается неудачей.104105Новое в версии 3.4.106107#### `PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)`108109*Возвращаемое значение: всегда NULL.*110111Аналогично [`PyErr_SetFromErrnoWithFilenameObject()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetFromErrnoWithFilenameObject), но имя файла задаётся как C-строка. *filename* декодируется из кодировки файловой системы ([`os.fsdecode()`](https://python-all.ru/3.9/library/os.html#os.fsdecode)).112113#### `PyObject* PyErr_SetFromWindowsErr(int ierr)`114115*Возвращаемое значение: всегда NULL.*116117Это вспомогательная функция для возбуждения [`WindowsError`](https://python-all.ru/3.9/library/exceptions.html#WindowsError). Если вызвана с *ierr* равным `0`, вместо него используется код ошибки, возвращаемый вызовом `GetLastError()`. Она вызывает функцию Win32 `FormatMessage()` для получения описания кода ошибки Windows, заданного *ierr* или `GetLastError()`, затем создаёт кортеж, первый элемент которого – значение *ierr*, а второй – соответствующее сообщение об ошибке (полученное из `FormatMessage()`), и после этого вызывает `PyErr_SetObject(PyExc_WindowsError, object)`. Эта функция всегда возвращает `NULL`.118119[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.120121#### `PyObject* PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)`122123*Возвращаемое значение: всегда NULL.*124125Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetFromWindowsErr), с дополнительным параметром, указывающим тип возбуждаемого исключения.126127[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.128129#### `PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)`130131*Возвращаемое значение: всегда NULL.*132133Аналогично `PyErr_SetFromWindowsErrWithFilenameObject()`, но имя файла передаётся как C-строка. *filename* декодируется из кодировки файловой системы ([`os.fsdecode()`](https://python-all.ru/3.9/library/os.html#os.fsdecode)).134135[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.136137#### `PyObject* PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)`138139*Возвращаемое значение: всегда NULL.*140141Аналогично `PyErr_SetFromWindowsErrWithFilenameObject()`, с дополнительным параметром, указывающим тип возбуждаемого исключения.142143[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.144145#### `PyObject* PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)`146147*Возвращаемое значение: всегда NULL.*148149Аналогично [`PyErr_SetExcFromWindowsErrWithFilenameObject()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetExcFromWindowsErrWithFilenameObject), но принимает второй объект имени файла.150151[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.152153Новое в версии 3.4.154155#### `PyObject* PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)`156157*Возвращаемое значение: всегда NULL.*158159Аналогично [`PyErr_SetFromWindowsErrWithFilename()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetFromWindowsErrWithFilename), с дополнительным параметром, указывающим тип возбуждаемого исключения.160161[Доступность](https://python-all.ru/3.9/library/intro.html#availability): Windows.162163#### `PyObject* PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)`164165*Возвращаемое значение: всегда NULL.*166167Это удобная функция для возбуждения [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError). *msg* будет установлен как строка сообщения исключения. *name* и *path*, оба могут быть `NULL`, будут установлены как соответствующие атрибуты [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError): `name` и `path`.168169Новое в версии 3.3.170171#### `PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)`172173*Возвращаемое значение: всегда NULL.*174175Очень похожа на [`PyErr_SetImportError()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetImportError), но эта функция позволяет указать подкласс [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError) для возбуждения.176177Новое в версии 3.6.178179#### `void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)`180181Устанавливает информацию о файле, строке и смещении для текущего исключения. Если текущее исключение не является [`SyntaxError`](https://python-all.ru/3.9/library/exceptions.html#SyntaxError), то устанавливаются дополнительные атрибуты, из-за которых подсистема печати исключений считает исключение [`SyntaxError`](https://python-all.ru/3.9/library/exceptions.html#SyntaxError).182183Новое в версии 3.4.184185#### `void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)`186187Как и [`PyErr_SyntaxLocationObject()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SyntaxLocationObject), но *filename* – это байтовая строка, декодированная из файловой системной кодировки ([`os.fsdecode()`](https://python-all.ru/3.9/library/os.html#os.fsdecode)).188189Новое в версии 3.2.190191#### `void PyErr_SyntaxLocation(const char *filename, int lineno)`192193Как [`PyErr_SyntaxLocationEx()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SyntaxLocationEx), но параметр *col\_offset* опущен.194195#### `void PyErr_BadInternalCall()`196197Это сокращение для `PyErr_SetString(PyExc_SystemError, message)`, где *message* указывает, что внутренняя операция (например, функция Python/C API) была вызвана с недопустимым аргументом. Предназначено в основном для внутреннего использования.198199## Выдача предупреждений200201Используйте эти функции для выдачи предупреждений из кода на C. Они аналогичны соответствующим функциям, экспортируемым модулем Python [`warnings`](https://python-all.ru/3.9/library/warnings.html#module-warnings). Обычно они выводят предупреждающее сообщение в *sys.stderr*; однако возможно, что пользователь указал превращать предупреждения в ошибки, и в этом случае они возбудят исключение. Также возможно, что функции возбуждают исключение из-за проблемы с механизмом предупреждений. Возвращаемое значение – `0`, если исключение не возбуждено, или `-1`, если исключение возбуждено. (Невозможно определить, было ли предупреждение фактически напечатано или какова причина исключения; это сделано намеренно.) Если исключение возбуждено, вызывающий код должен выполнить обычную обработку исключений (например, [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF) принадлежащие ссылки и вернуть значение ошибки).202203#### `int PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)`204205Выдает предупреждающее сообщение. Аргумент *category* – это категория предупреждения (см. ниже) или `NULL`; аргумент *message* – это строка в кодировке UTF-8. *stack\_level* – положительное число, задающее количество фреймов стека; предупреждение будет выдано от текущей выполняемой строки кода в этом фрейме стека. *stack\_level*, равный 1, – это функция, вызывающая [`PyErr_WarnEx()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_WarnEx), 2 – функция над ней, и так далее.206207Категории предупреждений должны быть подклассами `PyExc_Warning`; `PyExc_Warning` является подклассом `PyExc_Exception`; категория предупреждений по умолчанию – `PyExc_RuntimeWarning`. Стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых перечислены в разделе [Стандартные категории предупреждений](https://python-all.ru/3.9/c-api/exceptions.html#standardwarningcategories).208209Информацию об управлении предупреждениями см. в документации модуля [`warnings`](https://python-all.ru/3.9/library/warnings.html#module-warnings) и опции [`-W`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-w) в документации командной строки. API для управления предупреждениями на C не существует.210211#### `int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)`212213Выдаёт предупреждение с явным контролем всех его атрибутов. Это простая обёртка вокруг функции Python [`warnings.warn_explicit()`](https://python-all.ru/3.9/library/warnings.html#warnings.warn_explicit); за подробностями обращайтесь к её документации. Аргументы *module* и *registry* могут быть установлены в `NULL`, чтобы получить описанный там эффект по умолчанию.214215Новое в версии 3.4.216217#### `int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)`218219Похоже на [`PyErr_WarnExplicitObject()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_WarnExplicitObject), за исключением того, что *message* и *module* – это строки в кодировке UTF-8, а *filename* декодируется из файловой системной кодировки ([`os.fsdecode()`](https://python-all.ru/3.9/library/os.html#os.fsdecode)).220221#### `int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...)`222223Функция, аналогичная [`PyErr_WarnEx()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_WarnEx), но использующая [`PyUnicode_FromFormat()`](https://python-all.ru/3.9/c-api/unicode.html#c.PyUnicode_FromFormat) для форматирования предупреждающего сообщения. *format* – это строка в ASCII-кодировке.224225Новое в версии 3.2.226227#### `int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...)`228229Функция аналогична [`PyErr_WarnFormat()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_WarnFormat), но *category* равен [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning), и она передаёт *source* в `warnings.WarningMessage()`.230231Новое в версии 3.6.232233## Опрос индикатора ошибки234235#### `PyObject* PyErr_Occurred()`236237*Возвращаемое значение: заимствованная ссылка.*238239Проверяет, установлен ли индикатор ошибки. Если установлен, возвращает *тип* исключения (первый аргумент последнего вызова одной из функций `PyErr_Set*()` или [`PyErr_Restore()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_Restore)). Если не установлен, возвращает `NULL`. Вы не владеете ссылкой на возвращаемое значение, поэтому вам не нужно [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF) его.240241Вызывающий должен удерживать GIL.242243> **Примечание**244>245> Не сравнивайте возвращаемое значение с конкретным исключением; используйте вместо этого [`PyErr_ExceptionMatches()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_ExceptionMatches), как показано ниже. (Сравнение может легко не сработать, так как исключение может быть экземпляром, а не классом (в случае классового исключения) или подклассом ожидаемого исключения.)246247#### `int PyErr_ExceptionMatches(PyObject *exc)`248249Эквивалентно `PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)`. Эту функцию следует вызывать только тогда, когда исключение действительно установлено; при отсутствии возбуждённого исключения произойдёт нарушение доступа к памяти.250251#### `int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)`252253Возвращает истину, если *заданное* исключение соответствует типу исключения в *exc*. Если *exc* – объект класса, также возвращает истину, когда *given* является экземпляром подкласса. Если *exc* – кортеж, производится поиск соответствия среди всех типов исключений в кортеже (и рекурсивно во вложенных кортежах).254255#### `void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)`256257Извлекает индикатор ошибки в три переменные, чьи адреса передаются. Если индикатор ошибки не установлен, устанавливает все три переменные в `NULL`. Если он установлен, он будет очищен, и вы получаете владение ссылкой на каждый извлеченный объект. Объекты value и traceback могут иметь значение `NULL`, даже если объект type – нет.258259> **Примечание**260>261> Обычно эта функция используется только в коде, которому требуется перехватывать исключения, или в коде, которому нужно временно сохранять и восстанавливать индикатор ошибки. Например:262>263> ```c264> {265>    PyObject *type, *value, *traceback;266>    PyErr_Fetch(&type, &value, &traceback);267>268>    /* ... код, который может вызвать другие ошибки ... */269>270>    PyErr_Restore(type, value, traceback);271> }272> ```273274#### `void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)`275276Устанавливает индикатор ошибки на основе трёх объектов. Если индикатор ошибки уже установлен, он сначала сбрасывается. Если объекты равны `NULL`, индикатор ошибки сбрасывается. Не передавайте тип `NULL` и значение или трассировку, отличные от `NULL`. Тип исключения должен быть классом. Не передавайте недопустимый тип или значение исключения. (Нарушение этих правил приведёт к трудноуловимым проблемам в дальнейшем.) Этот вызов отнимает ссылку на каждый объект: перед вызовом у вас должна быть ссылка на каждый объект, а после вызова вы больше не владеете этими ссылками. (Если вы этого не понимаете, не используйте эту функцию. Я вас предупредил.)277278> **Примечание**279>280> Обычно эта функция используется только в коде, которому нужно временно сохранять и восстанавливать индикатор ошибки. Используйте [`PyErr_Fetch()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_Fetch) для сохранения текущего индикатора ошибки.281282#### `void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)`283284При определенных обстоятельствах значения, возвращаемые [`PyErr_Fetch()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_Fetch) ниже, могут быть «ненормализованными», то есть `*exc` является объектом класса, но `*val` не является экземпляром того же класса. В этом случае данная функция может использоваться для создания экземпляра класса. Если значения уже нормализованы, ничего не происходит. Отложенная нормализация реализована для повышения производительности.285286> **Примечание**287>288> Эта функция *не* устанавливает неявно атрибут `__traceback__` значения исключения. Если требуется корректно установить traceback, понадобится следующий дополнительный фрагмент кода:289>290> ```c291> if (tb != NULL) {292>   PyException_SetTraceback(val, tb);293> }294> ```295296#### `void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)`297298Извлекает информацию об исключении, как известно из `sys.exc_info()`. Речь идет об исключении, которое было *уже перехвачено*, а не об исключении, которое только что возникло. Возвращает новые ссылки на три объекта, любой из которых может быть `NULL`. Не изменяет состояние информации об исключении.299300> **Примечание**301>302> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_SetExcInfo()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_SetExcInfo), чтобы восстановить или очистить состояние исключения.303304Новое в версии 3.3.305306#### `void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)`307308Устанавливает информацию об исключении, как известно из `sys.exc_info()`. Речь идет об исключении, которое было *уже перехвачено*, а не об исключении, которое только что возникло. Эта функция крадет ссылки на аргументы. Чтобы очистить состояние исключения, передайте `NULL` для всех трех аргументов. Общие правила в отношении трех аргументов см. в [`PyErr_Restore()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_Restore).309310> **Примечание**311>312> Эта функция обычно не используется кодом, который хочет обрабатывать исключения. Скорее, она может использоваться, когда коду нужно временно сохранить и восстановить состояние исключения. Используйте [`PyErr_GetExcInfo()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_GetExcInfo), чтобы прочитать состояние исключения.313314Новое в версии 3.3.315316## Обработка сигналов317318#### `int PyErr_CheckSignals()`319320Эта функция взаимодействует с обработкой сигналов Python. Она проверяет, был ли отправлен сигнал процессам, и если да, вызывает соответствующий обработчик сигнала. Если модуль [`signal`](https://python-all.ru/3.9/library/signal.html#module-signal) поддерживается, может быть вызван обработчик сигнала, написанный на Python. Во всех случаях эффект по умолчанию для `SIGINT` – возбуждение исключения [`KeyboardInterrupt`](https://python-all.ru/3.9/library/exceptions.html#KeyboardInterrupt). Если исключение возбуждено, устанавливается индикатор ошибки, и функция возвращает `-1`; в противном случае функция возвращает `0`. Индикатор ошибки может быть сброшен или не сброшен, если он был установлен ранее.321322#### `void PyErr_SetInterrupt()`323324Имитирует поступление сигнала `SIGINT`. При следующем вызове [`PyErr_CheckSignals()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_CheckSignals) будет вызван обработчик сигнала Python для `SIGINT`.325326Если `SIGINT` не обрабатывается Python (установлено значение [`signal.SIG_DFL`](https://python-all.ru/3.9/library/signal.html#signal.SIG_DFL) или [`signal.SIG_IGN`](https://python-all.ru/3.9/library/signal.html#signal.SIG_IGN)), эта функция ничего не делает.327328#### `int PySignal_SetWakeupFd(int fd)`329330Эта вспомогательная функция задаёт файловый дескриптор, в который при получении сигнала записывается номер сигнала в виде одного байта. *fd* должен быть неблокирующим. Функция возвращает предыдущий такой файловый дескриптор.331332Значение `-1` отключает эту возможность; это начальное состояние. Это эквивалентно [`signal.set_wakeup_fd()`](https://python-all.ru/3.9/library/signal.html#signal.set_wakeup_fd) в Python, но без проверки ошибок. *fd* должен быть корректным файловым дескриптором. Функцию следует вызывать только из главного потока.333334Изменено в версии 3.5: В Windows функция теперь также поддерживает дескрипторы сокетов.335336## Классы исключений337338#### `PyObject* PyErr_NewException(const char *name, PyObject *base, PyObject *dict)`339340*Возвращаемое значение: новая ссылка.*341342Эта вспомогательная функция создаёт и возвращает новый класс исключения. Аргумент *name* должен быть именем нового исключения – строкой C вида `module.classname`. Аргументы *base* и *dict* обычно равны `NULL`. При этом создаётся класс, производный от [`Exception`](https://python-all.ru/3.9/library/exceptions.html#Exception) (доступен в C как `PyExc_Exception`).343344Атрибут `__module__` нового класса устанавливается в первую часть (до последней точки) аргумента *name*, а имя класса – в последнюю часть (после последней точки). Аргумент *base* можно использовать для указания альтернативных базовых классов; это может быть как один класс, так и кортеж классов. Аргумент *dict* можно использовать для указания словаря переменных и методов класса.345346#### `PyObject* PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)`347348*Возвращаемое значение: новая ссылка.*349350То же, что и [`PyErr_NewException()`](https://python-all.ru/3.9/c-api/exceptions.html#c.PyErr_NewException), за исключением того, что новому классу исключения можно легко задать докстринг: если *doc* не `NULL`, он будет использоваться в качестве докстринга класса исключения.351352Новое в версии 3.2.353354## Объекты исключений355356#### `PyObject* PyException_GetTraceback(PyObject *ex)`357358*Возвращаемое значение: новая ссылка.*359360Возвращает новую ссылку на traceback, связанный с исключением, как доступно из Python через `__traceback__`. Если связанный traceback отсутствует, возвращается `NULL`.361362#### `int PyException_SetTraceback(PyObject *ex, PyObject *tb)`363364Устанавливает traceback, связанный с исключением, в значение *tb*. Используйте `Py_None`, чтобы очистить его.365366#### `PyObject* PyException_GetContext(PyObject *ex)`367368*Возвращаемое значение: новая ссылка.*369370Возвращает новую ссылку на контекст (другой экземпляр исключения, во время обработки которого было возбуждено *ex*), связанный с исключением, как доступный из Python через `__context__`. Если связанный контекст отсутствует, возвращается `NULL`.371372#### `void PyException_SetContext(PyObject *ex, PyObject *ctx)`373374Устанавливает контекст, связанный с исключением, в *ctx*. Для очистки используйте `NULL`. Проверка типа, что *ctx* является экземпляром исключения, не выполняется. Эта функция перехватывает ссылку на *ctx*.375376#### `PyObject* PyException_GetCause(PyObject *ex)`377378*Возвращаемое значение: новая ссылка.*379380Возвращает новую ссылку на причину (экземпляр исключения или [`None`](https://python-all.ru/3.9/library/constants.html#None), установленную `raise ... from ...`), связанную с исключением, как доступно из Python через `__cause__`.381382#### `void PyException_SetCause(PyObject *ex, PyObject *cause)`383384Устанавливает причину, связанную с исключением, в *cause*. Для очистки используйте `NULL`. Проверка типа, что *cause* является экземпляром исключения или [`None`](https://python-all.ru/3.9/library/constants.html#None), не выполняется. Эта функция перехватывает ссылку на *cause*.385386Эта функция неявно устанавливает `__suppress_context__` в `True`.387388## Объекты исключений Unicode389390Следующие функции используются для создания и изменения исключений Unicode из C.391392#### `PyObject* PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`393394*Возвращаемое значение: новая ссылка.*395396Создаёт объект [`UnicodeDecodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeDecodeError) с атрибутами *encoding*, *object*, *length*, *start*, *end* и *reason*. *encoding* и *reason* – это строки в кодировке UTF-8.397398#### `PyObject* PyUnicodeEncodeError_Create(const char *encoding, const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`399400*Возвращаемое значение: новая ссылка.*401402Создаёт объект [`UnicodeEncodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeEncodeError) с атрибутами *encoding*, *object*, *length*, *start*, *end* и *reason*. *encoding* и *reason* – это строки в кодировке UTF-8.403404Устарело с версии 3.3: 3.11405406`Py_UNICODE` устарело начиная с Python 3.3. Пожалуйста, переходите на `PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnns", ...)`.407408#### `PyObject* PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`409410*Возвращаемое значение: новая ссылка.*411412Создает объект [`UnicodeTranslateError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeTranslateError) с атрибутами *object*, *length*, *start*, *end* и *reason*. *reason* – это строка в кодировке UTF-8.413414Устарело с версии 3.3: 3.11415416`Py_UNICODE` устарело начиная с Python 3.3. Пожалуйста, переходите на `PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns", ...)`.417418#### `PyObject* PyUnicodeDecodeError_GetEncoding(PyObject *exc)`419420#### `PyObject* PyUnicodeEncodeError_GetEncoding(PyObject *exc)`421422*Возвращаемое значение: новая ссылка.*423424Возвращает атрибут *encoding* указанного объекта исключения.425426#### `PyObject* PyUnicodeDecodeError_GetObject(PyObject *exc)`427428#### `PyObject* PyUnicodeEncodeError_GetObject(PyObject *exc)`429430#### `PyObject* PyUnicodeTranslateError_GetObject(PyObject *exc)`431432*Возвращаемое значение: новая ссылка.*433434Возвращает атрибут *object* указанного объекта исключения.435436#### `int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)`437438#### `int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)`439440#### `int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)`441442Получает атрибут *start* указанного объекта исключения и помещает его в *\*start*. *start* не должен быть равен `NULL`. Возвращает `0` в случае успеха, `-1` при ошибке.443444#### `int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)`445446#### `int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)`447448#### `int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)`449450Устанавливает атрибут *start* указанного объекта исключения в значение *start*. Возвращает `0` при успехе, `-1` при ошибке.451452#### `int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`453454#### `int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`455456#### `int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)`457458Получает атрибут *end* указанного объекта исключения и помещает его в *\*end*. *end* не должен быть равен `NULL`. Возвращает `0` в случае успеха, `-1` при ошибке.459460#### `int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)`461462#### `int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)`463464#### `int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)`465466Устанавливает атрибут *end* указанного объекта исключения в *end*. Возвращает `0` в случае успеха, `-1` при ошибке.467468#### `PyObject* PyUnicodeDecodeError_GetReason(PyObject *exc)`469470#### `PyObject* PyUnicodeEncodeError_GetReason(PyObject *exc)`471472#### `PyObject* PyUnicodeTranslateError_GetReason(PyObject *exc)`473474*Возвращаемое значение: новая ссылка.*475476Возвращает атрибут *reason* указанного объекта исключения.477478#### `int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)`479480#### `int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)`481482#### `int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)`483484Устанавливает атрибут *reason* указанного объекта исключения в значение *reason*. Возвращает `0` в случае успеха, `-1` в случае ошибки.485486## Управление рекурсией487488Эти две функции предоставляют способ безопасно выполнять рекурсивные вызовы на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает свою глубину рекурсии). Они также не нужны для реализаций *tp\_call*, поскольку [протокол вызова](https://python-all.ru/3.9/c-api/call.html#call) берёт на себя обработку рекурсии.489490#### `int Py_EnterRecursiveCall(const char *where)`491492Отмечает точку, в которой будет выполнен рекурсивный вызов на уровне C.493494Если определено `USE_STACKCHECK`, эта функция проверяет, не переполнился ли стек ОС с помощью [`PyOS_CheckStack()`](https://python-all.ru/3.9/c-api/sys.html#c.PyOS_CheckStack). Если это так, она устанавливает [`MemoryError`](https://python-all.ru/3.9/library/exceptions.html#MemoryError) и возвращает ненулевое значение.495496Затем функция проверяет, достигнут ли предел рекурсии. Если это так, устанавливается [`RecursionError`](https://python-all.ru/3.9/library/exceptions.html#RecursionError) и возвращается ненулевое значение. В противном случае возвращается ноль.497498*where* должна быть строкой в кодировке UTF-8, например `" in instance check"`, для добавления к сообщению [`RecursionError`](https://python-all.ru/3.9/library/exceptions.html#RecursionError), вызванному пределом глубины рекурсии.499500Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.501502#### `void Py_LeaveRecursiveCall(void)`503504Завершает [`Py_EnterRecursiveCall()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_EnterRecursiveCall). Должна вызываться один раз для каждого *успешного* вызова [`Py_EnterRecursiveCall()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_EnterRecursiveCall).505506Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.507508Для правильной реализации [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) для контейнерных типов требуется специальная обработка рекурсии. В дополнение к защите стека, [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) также необходимо отслеживать объекты для предотвращения циклов. Следующие две функции облегчают эту функциональность. По сути, это эквивалент [`reprlib.recursive_repr()`](https://python-all.ru/3.9/library/reprlib.html#reprlib.recursive_repr) на C.509510#### `int Py_ReprEnter(PyObject *object)`511512Вызывается в начале реализации [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) для обнаружения циклов.513514Если объект уже был обработан, функция возвращает положительное целое число. В этом случае реализация [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) должна вернуть строковый объект, указывающий на цикл. Например, объекты [`dict`](https://python-all.ru/3.9/library/stdtypes.html#dict) возвращают `{...}`, а объекты [`list`](https://python-all.ru/3.9/library/stdtypes.html#list) возвращают `[...]`.515516Функция возвращает отрицательное целое число, если достигнут предел рекурсии. В этом случае реализация [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) обычно должна возвращать `NULL`.517518В противном случае функция возвращает ноль, и реализация [`tp_repr`](https://python-all.ru/3.9/c-api/typeobj.html#c.PyTypeObject.tp_repr) может продолжить работу в обычном режиме.519520#### `void Py_ReprLeave(PyObject *object)`521522Завершает [`Py_ReprEnter()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_ReprEnter). Должна вызываться один раз для каждого вызова [`Py_ReprEnter()`](https://python-all.ru/3.9/c-api/exceptions.html#c.Py_ReprEnter), которая возвращает ноль.523524## Стандартные исключения525526Все стандартные исключения Python доступны в виде глобальных переменных, имена которых образуются из `PyExc_` с добавлением имени исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/3.9/c-api/structures.html#c.PyObject); все они являются объектами-классами. Для полноты картины здесь приведены все переменные:527528| Имя в C | Имя в Python | Примечания |529| --- | --- | --- |530| `PyExc_BaseException` | [`BaseException`](https://python-all.ru/3.9/library/exceptions.html#BaseException) | [1](https://python-all.ru/3.9/c-api/exceptions.html#id7) |531| `PyExc_Exception` | [`Exception`](https://python-all.ru/3.9/library/exceptions.html#Exception) | [1](https://python-all.ru/3.9/c-api/exceptions.html#id7) |532| `PyExc_ArithmeticError` | [`ArithmeticError`](https://python-all.ru/3.9/library/exceptions.html#ArithmeticError) | [1](https://python-all.ru/3.9/c-api/exceptions.html#id7) |533| `PyExc_AssertionError` | [`AssertionError`](https://python-all.ru/3.9/library/exceptions.html#AssertionError) |  |534| `PyExc_AttributeError` | [`AttributeError`](https://python-all.ru/3.9/library/exceptions.html#AttributeError) |  |535| `PyExc_BlockingIOError` | [`BlockingIOError`](https://python-all.ru/3.9/library/exceptions.html#BlockingIOError) |  |536| `PyExc_BrokenPipeError` | [`BrokenPipeError`](https://python-all.ru/3.9/library/exceptions.html#BrokenPipeError) |  |537| `PyExc_BufferError` | [`BufferError`](https://python-all.ru/3.9/library/exceptions.html#BufferError) |  |538| `PyExc_ChildProcessError` | [`ChildProcessError`](https://python-all.ru/3.9/library/exceptions.html#ChildProcessError) |  |539| `PyExc_ConnectionAbortedError` | [`ConnectionAbortedError`](https://python-all.ru/3.9/library/exceptions.html#ConnectionAbortedError) |  |540| `PyExc_ConnectionError` | [`ConnectionError`](https://python-all.ru/3.9/library/exceptions.html#ConnectionError) |  |541| `PyExc_ConnectionRefusedError` | [`ConnectionRefusedError`](https://python-all.ru/3.9/library/exceptions.html#ConnectionRefusedError) |  |542| `PyExc_ConnectionResetError` | [`ConnectionResetError`](https://python-all.ru/3.9/library/exceptions.html#ConnectionResetError) |  |543| `PyExc_EOFError` | [`EOFError`](https://python-all.ru/3.9/library/exceptions.html#EOFError) |  |544| `PyExc_FileExistsError` | [`FileExistsError`](https://python-all.ru/3.9/library/exceptions.html#FileExistsError) |  |545| `PyExc_FileNotFoundError` | [`FileNotFoundError`](https://python-all.ru/3.9/library/exceptions.html#FileNotFoundError) |  |546| `PyExc_FloatingPointError` | [`FloatingPointError`](https://python-all.ru/3.9/library/exceptions.html#FloatingPointError) |  |547| `PyExc_GeneratorExit` | [`GeneratorExit`](https://python-all.ru/3.9/library/exceptions.html#GeneratorExit) |  |548| `PyExc_ImportError` | [`ImportError`](https://python-all.ru/3.9/library/exceptions.html#ImportError) |  |549| `PyExc_IndentationError` | [`IndentationError`](https://python-all.ru/3.9/library/exceptions.html#IndentationError) |  |550| `PyExc_IndexError` | [`IndexError`](https://python-all.ru/3.9/library/exceptions.html#IndexError) |  |551| `PyExc_InterruptedError` | [`InterruptedError`](https://python-all.ru/3.9/library/exceptions.html#InterruptedError) |  |552| `PyExc_IsADirectoryError` | [`IsADirectoryError`](https://python-all.ru/3.9/library/exceptions.html#IsADirectoryError) |  |553| `PyExc_KeyError` | [`KeyError`](https://python-all.ru/3.9/library/exceptions.html#KeyError) |  |554| `PyExc_KeyboardInterrupt` | [`KeyboardInterrupt`](https://python-all.ru/3.9/library/exceptions.html#KeyboardInterrupt) |  |555| `PyExc_LookupError` | [`LookupError`](https://python-all.ru/3.9/library/exceptions.html#LookupError) | [1](https://python-all.ru/3.9/c-api/exceptions.html#id7) |556| `PyExc_MemoryError` | [`MemoryError`](https://python-all.ru/3.9/library/exceptions.html#MemoryError) |  |557| `PyExc_ModuleNotFoundError` | [`ModuleNotFoundError`](https://python-all.ru/3.9/library/exceptions.html#ModuleNotFoundError) |  |558| `PyExc_NameError` | [`NameError`](https://python-all.ru/3.9/library/exceptions.html#NameError) |  |559| `PyExc_NotADirectoryError` | [`NotADirectoryError`](https://python-all.ru/3.9/library/exceptions.html#NotADirectoryError) |  |560| `PyExc_NotImplementedError` | [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError) |  |561| `PyExc_OSError` | [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) | [1](https://python-all.ru/3.9/c-api/exceptions.html#id7) |562| `PyExc_OverflowError` | [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) |  |563| `PyExc_PermissionError` | [`PermissionError`](https://python-all.ru/3.9/library/exceptions.html#PermissionError) |  |564| `PyExc_ProcessLookupError` | [`ProcessLookupError`](https://python-all.ru/3.9/library/exceptions.html#ProcessLookupError) |  |565| `PyExc_RecursionError` | [`RecursionError`](https://python-all.ru/3.9/library/exceptions.html#RecursionError) |  |566| `PyExc_ReferenceError` | [`ReferenceError`](https://python-all.ru/3.9/library/exceptions.html#ReferenceError) |  |567| `PyExc_RuntimeError` | [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError) |  |568| `PyExc_StopAsyncIteration` | [`StopAsyncIteration`](https://python-all.ru/3.9/library/exceptions.html#StopAsyncIteration) |  |569| `PyExc_StopIteration` | [`StopIteration`](https://python-all.ru/3.9/library/exceptions.html#StopIteration) |  |570| `PyExc_SyntaxError` | [`SyntaxError`](https://python-all.ru/3.9/library/exceptions.html#SyntaxError) |  |571| `PyExc_SystemError` | [`SystemError`](https://python-all.ru/3.9/library/exceptions.html#SystemError) |  |572| `PyExc_SystemExit` | [`SystemExit`](https://python-all.ru/3.9/library/exceptions.html#SystemExit) |  |573| `PyExc_TabError` | [`TabError`](https://python-all.ru/3.9/library/exceptions.html#TabError) |  |574| `PyExc_TimeoutError` | [`TimeoutError`](https://python-all.ru/3.9/library/exceptions.html#TimeoutError) |  |575| `PyExc_TypeError` | [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError) |  |576| `PyExc_UnboundLocalError` | [`UnboundLocalError`](https://python-all.ru/3.9/library/exceptions.html#UnboundLocalError) |  |577| `PyExc_UnicodeDecodeError` | [`UnicodeDecodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeDecodeError) |  |578| `PyExc_UnicodeEncodeError` | [`UnicodeEncodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeEncodeError) |  |579| `PyExc_UnicodeError` | [`UnicodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeError) |  |580| `PyExc_UnicodeTranslateError` | [`UnicodeTranslateError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeTranslateError) |  |581| `PyExc_ValueError` | [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) |  |582| `PyExc_ZeroDivisionError` | [`ZeroDivisionError`](https://python-all.ru/3.9/library/exceptions.html#ZeroDivisionError) |  |583584Новое в версии 3.3: `PyExc_BlockingIOError`, `PyExc_BrokenPipeError`, `PyExc_ChildProcessError`, `PyExc_ConnectionError`, `PyExc_ConnectionAbortedError`, `PyExc_ConnectionRefusedError`, `PyExc_ConnectionResetError`, `PyExc_FileExistsError`, `PyExc_FileNotFoundError`, `PyExc_InterruptedError`, `PyExc_IsADirectoryError`, `PyExc_NotADirectoryError`, `PyExc_PermissionError`, `PyExc_ProcessLookupError` и `PyExc_TimeoutError` были введены в соответствии с [**PEP 3151**](https://python-all.ru/3.9/c-api/exceptions.html).585586Новое в версии 3.5: `PyExc_StopAsyncIteration` и `PyExc_RecursionError`.587588Новое в версии 3.6: `PyExc_ModuleNotFoundError`.589590Это псевдонимы для совместимости с `PyExc_OSError`:591592| Имя в C | Примечания |593| --- | --- |594| `PyExc_EnvironmentError` |  |595| `PyExc_IOError` |  |596| `PyExc_WindowsError` | [2](https://python-all.ru/3.9/c-api/exceptions.html#id8) |597598Изменено в версии 3.3: Раньше эти псевдонимы были отдельными типами исключений.599600Примечания:601602**1([1](https://python-all.ru/3.9/c-api/exceptions.html#id1),[2](https://python-all.ru/3.9/c-api/exceptions.html#id2),[3](https://python-all.ru/3.9/c-api/exceptions.html#id3),[4](https://python-all.ru/3.9/c-api/exceptions.html#id4),[5](https://python-all.ru/3.9/c-api/exceptions.html#id5))**603604Это базовый класс для других стандартных исключений.605606**[2](https://python-all.ru/3.9/c-api/exceptions.html#id6)**607608Определено только в Windows; защитите код, использующий это, проверкой, что определён макрос препроцессора `MS_WINDOWS`.609610## Стандартные категории предупреждений611612Все стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых образуются из `PyExc_` с добавлением имени исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/3.9/c-api/structures.html#c.PyObject); все они являются объектами-классами. Для полноты картины здесь приведены все переменные:613614| Имя в C | Имя в Python | Примечания |615| --- | --- | --- |616| `PyExc_Warning` | [`Warning`](https://python-all.ru/3.9/library/exceptions.html#Warning) | [3](https://python-all.ru/3.9/c-api/exceptions.html#id10) |617| `PyExc_BytesWarning` | [`BytesWarning`](https://python-all.ru/3.9/library/exceptions.html#BytesWarning) |  |618| `PyExc_DeprecationWarning` | [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning) |  |619| `PyExc_FutureWarning` | [`FutureWarning`](https://python-all.ru/3.9/library/exceptions.html#FutureWarning) |  |620| `PyExc_ImportWarning` | [`ImportWarning`](https://python-all.ru/3.9/library/exceptions.html#ImportWarning) |  |621| `PyExc_PendingDeprecationWarning` | [`PendingDeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#PendingDeprecationWarning) |  |622| `PyExc_ResourceWarning` | [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning) |  |623| `PyExc_RuntimeWarning` | [`RuntimeWarning`](https://python-all.ru/3.9/library/exceptions.html#RuntimeWarning) |  |624| `PyExc_SyntaxWarning` | [`SyntaxWarning`](https://python-all.ru/3.9/library/exceptions.html#SyntaxWarning) |  |625| `PyExc_UnicodeWarning` | [`UnicodeWarning`](https://python-all.ru/3.9/library/exceptions.html#UnicodeWarning) |  |626| `PyExc_UserWarning` | [`UserWarning`](https://python-all.ru/3.9/library/exceptions.html#UserWarning) |  |627628Новое в версии 3.2: `PyExc_ResourceWarning`.629630Примечания:631632**[3](https://python-all.ru/3.9/c-api/exceptions.html#id9)**633634Это базовый класс для других стандартных категорий предупреждений.635