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

exceptions.md

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

1> **Источник:** https://python-all.ru/2.7/c-api/exceptions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Обработка исключений89Функции, описанные в этой главе, позволяют обрабатывать и возбуждать исключения Python. Важно понимать некоторые основы обработки исключений в Python. Она работает примерно как переменная `errno` в Unix: существует глобальный индикатор (на каждый поток) последней произошедшей ошибки. Большинство функций не сбрасывают его при успехе, но устанавливают его для указания причины ошибки при неудаче. Большинство функций также возвращают индикатор ошибки, обычно *NULL*, если они должны возвращать указатель, или `-1`, если возвращают целое число (исключение: функции `PyArg_*()` возвращают `1` при успехе и `0` при неудаче).1011Когда функция должна завершиться ошибкой, потому что вызванная ей функция завершилась ошибкой, она обычно не устанавливает индикатор ошибки; его уже установила вызванная функция. Она отвечает либо за обработку ошибки и очистку исключения, либо за возврат после освобождения всех удерживаемых ресурсов (таких как ссылки на объекты или выделенная память); она *не* должна продолжать нормальное выполнение, если не готова обработать ошибку. При возврате из-за ошибки важно указать вызывающему коду, что ошибка была установлена. Если ошибка не обрабатывается или не аккуратно распространяется, последующие вызовы Python/C API могут вести себя не так, как задумано, и могут отказать загадочным образом.1213Индикатор ошибки состоит из трёх объектов Python, соответствующих переменным Python `sys.exc_type`, `sys.exc_value` и `sys.exc_traceback`. Существуют функции API для взаимодействия с индикатором ошибки различными способами. Для каждого потока существует отдельный индикатор ошибки.1415#### `void PyErr_PrintEx(int set_sys_last_vars)`1617Выводит стандартную трассировку в `sys.stderr` и очищает индикатор ошибки. **Если только** ошибка не является `SystemExit`. В этом случае трассировка не выводится, и процесс Python завершится с кодом ошибки, указанным экземпляром `SystemExit`.1819Вызывайте эту функцию **только**, когда установлен индикатор ошибки. В противном случае это вызовет фатальную ошибку!2021Если *set\_sys\_last\_vars* ненулевое, переменные [`sys.last_type`](https://python-all.ru/2.7/library/sys.html#sys.last_type), [`sys.last_value`](https://python-all.ru/2.7/library/sys.html#sys.last_value) и [`sys.last_traceback`](https://python-all.ru/2.7/library/sys.html#sys.last_traceback) будут установлены в тип, значение и трассировку напечатанного исключения соответственно.2223#### `void PyErr_Print()`2425Псевдоним для `PyErr_PrintEx(1)`.2627#### `PyObject* PyErr_Occurred()`2829*Возвращаемое значение: заимствованная ссылка.*3031Проверяет, установлен ли индикатор ошибки. Если установлен, возвращает *type* исключения (первый аргумент последнего вызова одной из функций `PyErr_Set*()` или [`PyErr_Restore()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_Restore)). Если не установлен, возвращает *NULL*. Вы не владеете ссылкой на возвращаемое значение, поэтому вам не нужно его [`Py_DECREF()`](https://python-all.ru/2.7/c-api/refcounting.html#c.Py_DECREF).3233> **Примечание**34>35> Не сравнивайте возвращаемое значение с конкретным исключением; используйте вместо этого [`PyErr_ExceptionMatches()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_ExceptionMatches), как показано ниже. (Сравнение может легко не сработать, так как исключение может быть экземпляром, а не классом (в случае классового исключения) или подклассом ожидаемого исключения.)3637#### `int PyErr_ExceptionMatches(PyObject *exc)`3839Эквивалентно `PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)`. Эту функцию следует вызывать только тогда, когда исключение действительно установлено; при отсутствии возбуждённого исключения произойдёт нарушение доступа к памяти.4041#### `int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)`4243Возвращает истину, если исключение *given* соответствует исключению в *exc*. Если *exc* – объект класса, также возвращает истину, когда *given* является экземпляром подкласса. Если *exc* – кортеж, выполняется поиск совпадения по всем исключениям кортежа (и рекурсивно по вложенным кортежам).4445#### `void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)`4647При определенных обстоятельствах значения, возвращаемые [`PyErr_Fetch()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_Fetch) ниже, могут быть «ненормализованными», то есть `*exc` является объектом класса, но `*val` не является экземпляром того же класса. В этом случае данная функция может использоваться для создания экземпляра класса. Если значения уже нормализованы, ничего не происходит. Отложенная нормализация реализована для повышения производительности.4849#### `void PyErr_Clear()`5051Очищает индикатор ошибки. Если индикатор ошибки не установлен, эффекта нет.5253#### `void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)`5455Извлекает индикатор ошибки в три переменные, адреса которых передаются. Если индикатор ошибки не установлен, устанавливает все три переменные в *NULL*. Если установлен, он будет очищен, и вы получаете владение ссылкой на каждый извлечённый объект. Значение и объект traceback могут быть *NULL*, даже если объект типа не NULL.5657> **Примечание**58>59> Эта функция обычно используется только кодом, которому нужно обрабатывать исключения, или кодом, которому требуется временно сохранить и восстановить индикатор ошибки.6061#### `void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)`6263Set the error indicator from the three objects. If the error indicator is already set, it is cleared first. If the objects are *NULL*, the error indicator is cleared. Do not pass a *NULL* type and non-*NULL* value or traceback. The exception type should be a class. Do not pass an invalid exception type or value. (Violating these rules will cause subtle problems later.) This call takes away a reference to each object: you must own a reference to each object before the call and after the call you no longer own these references. (If you don’t understand this, don’t use this function. I warned you.)6465> **Примечание**66>67> Эта функция обычно используется только кодом, которому требуется временно сохранить и восстановить индикатор ошибки; используйте [`PyErr_Fetch()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_Fetch) для сохранения текущего состояния исключения.6869#### `void PyErr_SetString(PyObject *type, const char *message)`7071Это наиболее распространённый способ установки индикатора ошибки. Первый аргумент задаёт тип исключения; обычно это одно из стандартных исключений, например `PyExc_RuntimeError`. Увеличивать счётчик ссылок на него не требуется. Второй аргумент – сообщение об ошибке; оно преобразуется в строковый объект.7273#### `void PyErr_SetObject(PyObject *type, PyObject *value)`7475Эта функция аналогична [`PyErr_SetString()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetString), но позволяет указать произвольный объект Python для «значения» исключения.7677#### `PyObject* PyErr_Format(PyObject *exception, const char *format, ...)`7879*Возвращаемое значение: всегда NULL.*8081Эта функция устанавливает индикатор ошибки и возвращает *NULL*. Аргумент *exception* должен быть классом исключения Python. Параметры *format* и последующие помогают форматировать сообщение об ошибке; их смысл и значения совпадают с [`PyString_FromFormat()`](https://python-all.ru/2.7/c-api/string.html#c.PyString_FromFormat).8283#### `void PyErr_SetNone(PyObject *type)`8485Это сокращение для `PyErr_SetObject(type, Py_None)`.8687#### `int PyErr_BadArgument()`8889Это сокращение для `PyErr_SetString(PyExc_TypeError, message)`, где *message* указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном предназначено для внутреннего использования.9091#### `PyObject* PyErr_NoMemory()`9293*Возвращаемое значение: всегда NULL.*9495Это сокращённая запись для `PyErr_SetNone(PyExc_MemoryError)`; она возвращает *NULL*, чтобы функция выделения объекта могла записать `return PyErr_NoMemory();` при нехватке памяти.9697#### `PyObject* PyErr_SetFromErrno(PyObject *type)`9899*Возвращаемое значение: всегда NULL.*100101Это удобная функция для возбуждения исключения, когда библиотечная функция C вернула ошибку и установила переменную C `errno`. Она создаёт объект-кортеж, первый элемент которого – целое значение `errno`, а второй – соответствующее сообщение об ошибке (полученное из `strerror()`), и затем вызывает `PyErr_SetObject(type, object)`. В Unix, когда значение `errno` равно `EINTR`, что указывает на прерванный системный вызов, эта функция вызывает [`PyErr_CheckSignals()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_CheckSignals), и если тот устанавливает индикатор ошибки, оставляет его установленным. Функция всегда возвращает *NULL*, поэтому функция-обёртка вокруг системного вызова может записать `return PyErr_SetFromErrno(type);`, когда системный вызов возвращает ошибку.102103#### `PyObject* PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)`104105Аналогично [`PyErr_SetFromErrno()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromErrno), с дополнительным поведением: если *filenameObject* не равен *NULL*, он передаётся конструктору *type* в качестве третьего параметра. Для таких исключений, как [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError) и [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError), это используется для определения атрибута `filename` экземпляра исключения.106107#### `PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)`108109*Возвращаемое значение: всегда NULL.*110111Аналогично [`PyErr_SetFromErrnoWithFilenameObject()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromErrnoWithFilenameObject), но имя файла передаётся в виде строки C.112113#### `PyObject* PyErr_SetFromWindowsErr(int ierr)`114115*Возвращаемое значение: всегда NULL.*116117Это удобная функция для возбуждения [`WindowsError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.WindowsError). Если она вызвана с *ierr* равным `0`, используется код ошибки, возвращённый вызовом `GetLastError()`. Она вызывает функцию Win32 `FormatMessage()` для получения описания Windows для кода ошибки, заданного *ierr* или `GetLastError()`, затем создаёт объект-кортеж, первый элемент которого – значение *ierr*, а второй – соответствующее сообщение об ошибке (полученное из `FormatMessage()`), и затем вызывает `PyErr_SetObject(PyExc_WindowsError, object)`. Эта функция всегда возвращает *NULL*. Доступность: Windows.118119#### `PyObject* PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)`120121*Возвращаемое значение: всегда NULL.*122123Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromWindowsErr), с дополнительным параметром, указывающим тип возбуждаемого исключения. Доступность: Windows.124125Новое в версии 2.3.126127#### `PyObject* PyErr_SetFromWindowsErrWithFilenameObject(int ierr, PyObject *filenameObject)`128129Аналогично [`PyErr_SetFromWindowsErr()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromWindowsErr), с дополнительным поведением: если *filenameObject* не равен *NULL*, он передаётся конструктору [`WindowsError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.WindowsError) в качестве третьего параметра. Доступность: Windows.130131#### `PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)`132133*Возвращаемое значение: всегда NULL.*134135Аналогично [`PyErr_SetFromWindowsErrWithFilenameObject()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromWindowsErrWithFilenameObject), но имя файла передаётся в виде строки C. Доступность: Windows.136137#### `PyObject* PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)`138139Аналогично [`PyErr_SetFromWindowsErrWithFilenameObject()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromWindowsErrWithFilenameObject), с дополнительным параметром, указывающим тип возбуждаемого исключения. Доступность: Windows.140141Новое в версии 2.3.142143#### `PyObject* PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)`144145*Возвращаемое значение: всегда NULL.*146147Аналогично [`PyErr_SetFromWindowsErrWithFilename()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_SetFromWindowsErrWithFilename), с дополнительным параметром, указывающим тип возбуждаемого исключения. Доступность: Windows.148149Новое в версии 2.3.150151#### `void PyErr_BadInternalCall()`152153Это сокращение для `PyErr_SetString(PyExc_SystemError, message)`, где *message* указывает, что внутренняя операция (например, функция Python/C API) была вызвана с недопустимым аргументом. Предназначено в основном для внутреннего использования.154155#### `int PyErr_WarnEx(PyObject *category, char *message, int stacklevel)`156157Выдаёт предупреждающее сообщение. Аргумент *category* – категория предупреждения (см. ниже) или *NULL*; аргумент *message* – строка сообщения. *stacklevel* – положительное число, указывающее количество кадров стека; предупреждение будет выдано из текущей выполняемой строки кода в этом кадре стека. Значение *stacklevel*, равное 1, соответствует функции, вызывающей [`PyErr_WarnEx()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_WarnEx), 2 – функции выше неё, и так далее.158159Эта функция обычно выводит сообщение предупреждения в *sys.stderr*; однако возможно, что пользователь указал превращать предупреждения в ошибки, и в этом случае будет возбуждено исключение. Также возможно, что функция возбуждает исключение из-за проблемы в механизме предупреждений (реализация импортирует модуль [`warnings`](https://python-all.ru/2.7/library/warnings.html#module-warnings) для выполнения основной работы). Возвращаемое значение равно `0`, если исключение не возбуждено, или `-1`, если исключение возбуждено. (Нельзя определить, было ли сообщение предупреждения на самом деле выведено, а также причину исключения; это сделано намеренно.) Если исключение возбуждено, вызывающий код должен выполнить обычную обработку исключения (например, [`Py_DECREF()`](https://python-all.ru/2.7/c-api/refcounting.html#c.Py_DECREF) принадлежащие ссылки и вернуть значение ошибки).160161Категории предупреждений должны быть подклассами `PyExc_Warning`; `PyExc_Warning` является подклассом `PyExc_Exception`; категория предупреждений по умолчанию – `PyExc_RuntimeWarning`. Стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых перечислены в разделе [Стандартные категории предупреждений](https://python-all.ru/2.7/c-api/exceptions.html#standardwarningcategories).162163Информацию об управлении предупреждениями см. в документации модуля [`warnings`](https://python-all.ru/2.7/library/warnings.html#module-warnings) и опции [`-W`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-w) в документации командной строки. API для управления предупреждениями на C не существует.164165#### `int PyErr_Warn(PyObject *category, char *message)`166167Выдаёт предупреждающее сообщение. Аргумент *category* – категория предупреждения (см. ниже) или *NULL*; аргумент *message* – строка сообщения. Предупреждение будет выглядеть так, как будто оно выдано из функции, вызывающей [`PyErr_Warn()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_Warn), что эквивалентно вызову [`PyErr_WarnEx()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_WarnEx) с *stacklevel*, равным 1.168169Устарело; используйте [`PyErr_WarnEx()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_WarnEx) вместо этого.170171#### `int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)`172173Выдаёт предупреждение с явным контролем всех атрибутов предупреждения. Это прямая обёртка вокруг функции Python [`warnings.warn_explicit()`](https://python-all.ru/2.7/library/warnings.html#warnings.warn_explicit); обратитесь к ней за дополнительной информацией. Аргументы *module* и *registry* могут быть установлены в *NULL* для получения описанного там эффекта по умолчанию.174175#### `int PyErr_WarnPy3k(char *message, int stacklevel)`176177Выдаёт [`DeprecationWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.DeprecationWarning) с указанными *message* и *stacklevel*, если включён флаг `Py_Py3kWarningFlag`.178179Новое в версии 2.6.180181#### `int PyErr_CheckSignals()`182183Эта функция взаимодействует с обработкой сигналов Python. Она проверяет, был ли отправлен сигнал процессам, и если да, вызывает соответствующий обработчик сигнала. Если модуль [`signal`](https://python-all.ru/2.7/library/signal.html#module-signal) поддерживается, может быть вызван обработчик сигнала, написанный на Python. Во всех случаях эффект по умолчанию для `SIGINT` – возбуждение исключения [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt). Если исключение возбуждено, устанавливается индикатор ошибки, и функция возвращает `-1`; в противном случае функция возвращает `0`. Индикатор ошибки может быть сброшен или не сброшен, если он был установлен ранее.184185#### `void PyErr_SetInterrupt()`186187Эта функция имитирует действие сигнала `SIGINT` – при следующем вызове [`PyErr_CheckSignals()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_CheckSignals) будет возбуждено [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt). Её можно вызывать, не удерживая блокировку интерпретатора.188189#### `int PySignal_SetWakeupFd(int fd)`190191Эта вспомогательная функция задаёт файловый дескриптор, в который будет записан байт `'\0'` при получении сигнала. Возвращается предыдущий такой дескриптор. Значение `-1` отключает эту возможность; это состояние по умолчанию. Эта функция эквивалентна [`signal.set_wakeup_fd()`](https://python-all.ru/2.7/library/signal.html#signal.set_wakeup_fd) в Python, но без проверки ошибок. *fd* должен быть корректным файловым дескриптором. Функцию следует вызывать только из главного потока.192193Новое в версии 2.6.194195#### `PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict)`196197*Возвращаемое значение: новая ссылка.*198199Эта вспомогательная функция создаёт и возвращает новый класс исключений. Аргумент *name* должен быть именем нового исключения – C-строка вида `module.classname`. Аргументы *base* и *dict* обычно равны *NULL*. В результате создаётся объект класса, производный от [`Exception`](https://python-all.ru/2.7/library/exceptions.html#exceptions.Exception) (доступен в C как `PyExc_Exception`).200201Атрибут `__module__` нового класса устанавливается в первую часть (до последней точки) аргумента *name*, а имя класса – в последнюю часть (после последней точки). Аргумент *base* можно использовать для указания альтернативных базовых классов; это может быть как один класс, так и кортеж классов. Аргумент *dict* можно использовать для указания словаря переменных и методов класса.202203#### `PyObject* PyErr_NewExceptionWithDoc(char *name, char *doc, PyObject *base, PyObject *dict)`204205*Возвращаемое значение: новая ссылка.*206207То же, что и [`PyErr_NewException()`](https://python-all.ru/2.7/c-api/exceptions.html#c.PyErr_NewException), с тем отличием, что новому классу исключений можно легко задать docstring: если *doc* не равно *NULL*, оно будет использоваться как строка документации для класса исключений.208209Новое в версии 2.7.210211#### `void PyErr_WriteUnraisable(PyObject *obj)`212213Эта вспомогательная функция выводит предупреждающее сообщение в `sys.stderr`, когда исключение было установлено, но интерпретатор не может его фактически возбудить. Она используется, например, когда исключение возникает в методе [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__).214215Функция вызывается с единственным аргументом *obj*, идентифицирующим контекст, в котором возникло необрабатываемое исключение. Если возможно, в предупреждающем сообщении будет выведено представление (repr) *obj*.216217## Объекты исключений Unicode218219Следующие функции используются для создания и изменения исключений Unicode из C.220221#### `PyObject* PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`222223Создаёт объект `UnicodeDecodeError` с атрибутами *encoding*, *object*, *length*, *start*, *end* и *reason*.224225#### `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)`226227Создаёт объект `UnicodeEncodeError` с атрибутами *encoding*, *object*, *length*, *start*, *end* и *reason*.228229#### `PyObject* PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)`230231Создаёт объект `UnicodeTranslateError` с атрибутами *object*, *length*, *start*, *end* и *reason*.232233#### `PyObject* PyUnicodeDecodeError_GetEncoding(PyObject *exc)`234235#### `PyObject* PyUnicodeEncodeError_GetEncoding(PyObject *exc)`236237Возвращает атрибут *encoding* указанного объекта исключения.238239#### `PyObject* PyUnicodeDecodeError_GetObject(PyObject *exc)`240241#### `PyObject* PyUnicodeEncodeError_GetObject(PyObject *exc)`242243#### `PyObject* PyUnicodeTranslateError_GetObject(PyObject *exc)`244245Возвращает атрибут *object* указанного объекта исключения.246247#### `int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)`248249#### `int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)`250251#### `int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)`252253Получает атрибут *start* заданного объекта исключения и помещает его в *\*start*. *start* не должен быть *NULL*. Возвращает `0` в случае успеха, `-1` при неудаче.254255#### `int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)`256257#### `int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)`258259#### `int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)`260261Устанавливает атрибут *start* указанного объекта исключения в значение *start*. Возвращает `0` при успехе, `-1` при ошибке.262263#### `int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`264265#### `int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)`266267#### `int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)`268269Получает атрибут *end* заданного объекта исключения и помещает его в *\*end*. *end* не должен быть *NULL*. Возвращает `0` в случае успеха, `-1` при неудаче.270271#### `int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)`272273#### `int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)`274275#### `int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)`276277Устанавливает атрибут *end* указанного объекта исключения в *end*. Возвращает `0` в случае успеха, `-1` при ошибке.278279#### `PyObject* PyUnicodeDecodeError_GetReason(PyObject *exc)`280281#### `PyObject* PyUnicodeEncodeError_GetReason(PyObject *exc)`282283#### `PyObject* PyUnicodeTranslateError_GetReason(PyObject *exc)`284285Возвращает атрибут *reason* указанного объекта исключения.286287#### `int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)`288289#### `int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)`290291#### `int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)`292293Устанавливает атрибут *reason* указанного объекта исключения в значение *reason*. Возвращает `0` в случае успеха, `-1` в случае ошибки.294295## Управление рекурсией296297Эти две функции предоставляют способ выполнения безопасных рекурсивных вызовов на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает свою глубину рекурсии).298299#### `int Py_EnterRecursiveCall(const char *where)`300301Отмечает точку, в которой будет выполнен рекурсивный вызов на уровне C.302303Если определено `USE_STACKCHECK`, эта функция проверяет, не переполнился ли стек ОС с помощью [`PyOS_CheckStack()`](https://python-all.ru/2.7/c-api/sys.html#c.PyOS_CheckStack). Если это так, она устанавливает [`MemoryError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.MemoryError) и возвращает ненулевое значение.304305Затем функция проверяет, достигнут ли предел рекурсии. Если это так, устанавливается [`RuntimeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.RuntimeError) и возвращается ненулевое значение. В противном случае возвращается ноль.306307*where* должна быть строкой, например `" in instance check"`, которая будет добавлена к сообщению [`RuntimeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.RuntimeError), вызванному превышением глубины рекурсии.308309#### `void Py_LeaveRecursiveCall()`310311Завершает [`Py_EnterRecursiveCall()`](https://python-all.ru/2.7/c-api/exceptions.html#c.Py_EnterRecursiveCall). Должна вызываться один раз для каждого *успешного* вызова [`Py_EnterRecursiveCall()`](https://python-all.ru/2.7/c-api/exceptions.html#c.Py_EnterRecursiveCall).312313## Стандартные исключения314315Все стандартные исключения Python доступны в виде глобальных переменных, имена которых образуются из `PyExc_` с добавлением имени исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/2.7/c-api/structures.html#c.PyObject); все они являются объектами-классами. Для полноты картины здесь приведены все переменные:316317| Имя в C | Имя в Python | Примечания |318| --- | --- | --- |319| `PyExc_BaseException` | [`BaseException`](https://python-all.ru/2.7/library/exceptions.html#exceptions.BaseException) | (1), (4) |320| `PyExc_Exception` | [`Exception`](https://python-all.ru/2.7/library/exceptions.html#exceptions.Exception) | (1) |321| `PyExc_StandardError` | [`StandardError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StandardError) | (1) |322| `PyExc_ArithmeticError` | [`ArithmeticError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ArithmeticError) | (1) |323| `PyExc_AssertionError` | [`AssertionError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.AssertionError) |  |324| `PyExc_AttributeError` | [`AttributeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.AttributeError) |  |325| `PyExc_BufferError` | [`BufferError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.BufferError) |  |326| `PyExc_EnvironmentError` | [`EnvironmentError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.EnvironmentError) | (1) |327| `PyExc_EOFError` | [`EOFError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.EOFError) |  |328| `PyExc_FloatingPointError` | [`FloatingPointError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.FloatingPointError) |  |329| `PyExc_GeneratorExit` | [`GeneratorExit`](https://python-all.ru/2.7/library/exceptions.html#exceptions.GeneratorExit) |  |330| `PyExc_ImportError` | [`ImportError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ImportError) |  |331| `PyExc_IndentationError` | [`IndentationError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IndentationError) |  |332| `PyExc_IndexError` | [`IndexError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IndexError) |  |333| `PyExc_IOError` | [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError) |  |334| `PyExc_KeyError` | [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError) |  |335| `PyExc_KeyboardInterrupt` | [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt) |  |336| `PyExc_LookupError` | [`LookupError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.LookupError) | (1) |337| `PyExc_MemoryError` | [`MemoryError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.MemoryError) |  |338| `PyExc_NameError` | [`NameError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NameError) |  |339| `PyExc_NotImplementedError` | [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError) |  |340| `PyExc_OSError` | [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError) |  |341| `PyExc_OverflowError` | [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError) |  |342| `PyExc_ReferenceError` | [`ReferenceError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ReferenceError) | (2) |343| `PyExc_RuntimeError` | [`RuntimeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.RuntimeError) |  |344| `PyExc_StopIteration` | [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration) |  |345| `PyExc_SyntaxError` | [`SyntaxError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SyntaxError) |  |346| `PyExc_SystemError` | [`SystemError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemError) |  |347| `PyExc_SystemExit` | [`SystemExit`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemExit) |  |348| `PyExc_TabError` | [`TabError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TabError) |  |349| `PyExc_TypeError` | [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError) |  |350| `PyExc_UnboundLocalError` | [`UnboundLocalError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnboundLocalError) |  |351| `PyExc_UnicodeDecodeError` | [`UnicodeDecodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeDecodeError) |  |352| `PyExc_UnicodeEncodeError` | [`UnicodeEncodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeEncodeError) |  |353| `PyExc_UnicodeError` | [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError) |  |354| `PyExc_UnicodeTranslateError` | [`UnicodeTranslateError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeTranslateError) |  |355| `PyExc_VMSError` | [`VMSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.VMSError) | (5) |356| `PyExc_ValueError` | [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) |  |357| `PyExc_WindowsError` | [`WindowsError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.WindowsError) | (3) |358| `PyExc_ZeroDivisionError` | [`ZeroDivisionError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ZeroDivisionError) |  |359360Примечания:3613621. Это базовый класс для других стандартных исключений.3632. То же самое, что и [`weakref.ReferenceError`](https://python-all.ru/2.7/library/weakref.html#weakref.ReferenceError).3643. Определено только в Windows; защитите код, использующий это, проверкой, что определён макрос препроцессора `MS_WINDOWS`.3654. Новое в версии 2.5.3665. Определено только в VMS; код, использующий это, следует защитить проверкой, что макрос препроцессора `__VMS` определён.367368## Стандартные категории предупреждений369370Все стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых образуются из `PyExc_` с добавлением имени исключения Python. Они имеют тип [`PyObject*`](https://python-all.ru/2.7/c-api/structures.html#c.PyObject); все они являются объектами-классами. Для полноты картины здесь приведены все переменные:371372| Имя в C | Имя в Python | Примечания |373| --- | --- | --- |374| `PyExc_Warning` | [`Warning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.Warning) | (1) |375| `PyExc_BytesWarning` | [`BytesWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.BytesWarning) |  |376| `PyExc_DeprecationWarning` | [`DeprecationWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.DeprecationWarning) |  |377| `PyExc_FutureWarning` | [`FutureWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.FutureWarning) |  |378| `PyExc_ImportWarning` | [`ImportWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ImportWarning) |  |379| `PyExc_PendingDeprecationWarning` | [`PendingDeprecationWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.PendingDeprecationWarning) |  |380| `PyExc_RuntimeWarning` | [`RuntimeWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.RuntimeWarning) |  |381| `PyExc_SyntaxWarning` | [`SyntaxWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SyntaxWarning) |  |382| `PyExc_UnicodeWarning` | [`UnicodeWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeWarning) |  |383| `PyExc_UserWarning` | [`UserWarning`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UserWarning) |  |384385Примечания:3863871. Это базовый класс для других стандартных категорий предупреждений.388389## Строковые исключения390391Изменено в версии 2.6: Все возбуждаемые или перехватываемые исключения должны быть производными от [`BaseException`](https://python-all.ru/2.7/library/exceptions.html#exceptions.BaseException). Попытка возбудить строковое исключение теперь возбуждает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).392