Обработка исключений¶
Функции, описанные в этой главе, позволяют обрабатывать и создавать Python
исключения. Важно понимать некоторые основы обработки Python исключений. Она
работает аналогично переменной POSIX errno: существует глобальный
индикатор (на каждый поток) последней возникшей ошибки. Большинство функций C API
не сбрасывают это при успешном выполнении, но настраивают его для указания
причины ошибки при сбое. Большая часть функций API C также возвращает
индикатор ошибки, обычно NULL, если они должны возвращать
указатель или -1. Если они возвращают целое число (исключение:
PyArg_*() функция возвращает 1 при успехе и 0 при
неудаче).
В частности, индикатор ошибки состоит из трех указателей на объекты: типа
исключения, значение исключения и объекта трейсбэка. Любой из этих
указателей может быть NULL, если он не установлен (хотя некоторые
комбинации запрещены, например, нельзя иметь не-NULL трейсбэк, если
тип исключения - NULL).
Когда функция должна отказать из-за сбоя какой-либо функции, которую она вызвала, индикатор ошибки обычно не устанавливается; вызванная им функция уже установила его. Он отвечает либо за обработку ошибки и устранение исключения, либо за возврат после очистки любых хранящихся в нем ресурсов (таких как ссылки на объекты или аллоцированную память); он не должен продолжаться нормально, если он не готов обработать ошибку. При возврате из-за ошибки важно указать вызывающему, что была установлена ошибка. Если ошибка не обработана или тщательно не распространена, дополнительные вызовы в Python/C API могут вести себя не так, как предполагалось, и могут завершиться неудачей загадочными способами.
Примечание
Индикатор ошибки не является результатом sys.exc_info(). Первое из них
соответствует исключению, которое еще не поймано (и, следовательно, все еще
распространяется), в то время как второе возвращает исключение после того, как
оно поймано (и, следовательно, перестало распространяться).
Печать и очистка¶
- 
void 
PyErr_Clear()¶ Снять индикатор ошибки. Если индикатор ошибки не установлен, эффект отсутствует.
- 
void 
PyErr_PrintEx(int set_sys_last_vars)¶ Распечатать стандартный трейсбэк для
sys.stderrи сброса индикатора ошибки. Если не ошибка -SystemExit, в этом случае не трейсбэк распечатается и процесс Python выйдет с ошибкой из кода, определеннойSystemExitсущностью.Вызывайте эту функцию только, когда установлен индикатор ошибки. В противном случае это приведет к неустранимой ошибке!
Если set_sys_last_vars не равно нулю, переменные
sys.last_type,sys.last_valueиsys.last_tracebackбудут установлены на тип, значение и трейсбэк напечатанного исключения соответственно.
- 
void 
PyErr_Print()¶ Псевдоним для
PyErr_PrintEx(1).
- 
void 
PyErr_WriteUnraisable(PyObject *obj)¶ Вызов
sys.unraisablehook(), используя текущее исключение и аргумент obj.Эта служебная функция распечатывает предупреждающее сообщение для
sys.stderr, когда было установлено исключение, но интерпретатор не может фактически вызвать исключение. Это используется, например, при возникновении исключения в методе__del__().Функция вызывается с помощью единственного аргумента obj который определяет контекст, в котором возникло неразрешимое исключение. По возможности repr obj будет напечатан в предупреждающем сообщении.
При вызове этой функции необходимо задать исключение.
Создание исключений¶
Функции помогают установить текущий индикатор ошибок потока. Для
удобства некоторые из этих функций всегда возвращают указатель NULL для
использования в return инструкции.
- 
void 
PyErr_SetString(PyObject *type, const char *message)¶ Это наиболее распространенный способ установки индикатора ошибки. Первый аргумент указывает тип исключения; обычно это одно из стандартных исключений, например,
PyExc_RuntimeError. Нет необходимости увеличивать количество ссылок. Второй аргумент - сообщение об ошибке; он декодируется из'utf-8„.
- 
void 
PyErr_SetObject(PyObject *type, PyObject *value)¶ Функция аналогична
PyErr_SetString(), но позволяет указать произвольный объект Python для «значения» исключения.
- 
PyObject* 
PyErr_Format(PyObject *exception, const char *format, ...)¶ - Return value: Always NULL.
Функция устанавливает индикатор ошибки и возвращает
NULL. exception должен быть Python классом исключения. format и последующие параметры помогают форматировать сообщение об ошибке; они имеют то же значение и значения, что и вPyUnicode_FromFormat(). format - это ASCII кодированная строка. 
- 
PyObject* 
PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)¶ - Return value: Always NULL.
То же, что и
PyErr_Format(), но принимая аргументva_list, а не переменное число аргументов.Добавлено в версии 3.5.
 
- 
int 
PyErr_BadArgument()¶ Это краткий текст для
PyErr_SetString(PyExc_TypeError, message), где message указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном для внутреннего использования.
- 
PyObject* 
PyErr_NoMemory()¶ - Return value: Always NULL.
Это краткий текст для
PyErr_SetNone(PyExc_MemoryError); она возвращаетNULL, так что функция распределения объектов может записыватьreturn PyErr_NoMemory();, когда ей не хватает памяти. 
- 
PyObject* 
PyErr_SetFromErrno(PyObject *type)¶ - Return value: Always NULL.
Удобная функция для создания исключения, когда функция библиотеки C возвращенный ошибку и устанавливает
errnoпеременной C. Она строит объект кортежа, первый элемент которого - целочисленное значениеerrnoи чей второй элемент - соответствующее сообщение об ошибке (полученный отstrerror()) и затем вызываетPyErr_SetObject(type, object). В Unix приerrnoзначениеEINTR, указывающего на прерванный системный вызов, этот вызовPyErr_CheckSignals(), и если он устанавливает индикатор ошибки, оставляет его установленным. Функция всегда возвращаетNULL, поэтому функция-обертка вокруг системного вызова может записыватьreturn PyErr_SetFromErrno(type);, когда системный вызов возвращает ошибку. 
- 
PyObject* 
PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromErrno(), с дополнительным поведением, что если filenameObject неNULL, он передается конструктору type как третий параметр. В случае исключенияOSError, используется чтобы определитьfilenameатрибут сущности исключения. 
- 
PyObject* 
PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromErrnoWithFilenameObject(), но принимает второй объект имени файла объекта, для создания ошибок при сбое функции, которая принимает два имени файлов.Добавлено в версии 3.4.
 
- 
PyObject* 
PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromErrnoWithFilenameObject(), но имя файла задано как C строка. filename декодируется из кодировки файловой системы (os.fsdecode()). 
- 
PyObject* 
PyErr_SetFromWindowsErr(int ierr)¶ - Return value: Always NULL.
Удобная функция для поднятия
WindowsError. Если вызывана с ierr0, ошибочный код возвращенный вызовом кGetLastError()- используется вместо нее. Он вызывает функцию Win32FormatMessage(), чтобы получить описание кода ошибки в Windows, данное ierr илиGetLastError(), затем он создает объект кортежа, первый элемент которого является ierr значением и второй элемент которого является соответствующим сообщением об ошибке (получено изFormatMessage()), а затем вызываетPyErr_SetObject(PyExc_WindowsError, object). Функция всегда возвращаетNULL.Availability: Windows.
 
- 
PyObject* 
PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromWindowsErr(), с дополнительным параметром, указывающим тип создаваемого исключения.Availability: Windows.
 
- 
PyObject* 
PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilenameObject(), но имя файла задано как C строка. filename декодируется из кодировки файловой системы (os.fsdecode()).Availability: Windows.
 
- 
PyObject* 
PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilenameObject(), с дополнительным параметром, указывающим тип создаваемого исключения.Availability: Windows.
 
- 
PyObject* 
PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)¶ - Return value: Always NULL.
Аналогично
PyErr_SetExcFromWindowsErrWithFilenameObject(), но принимает второй объект имени файла.Availability: Windows.
Добавлено в версии 3.4.
 
- 
PyObject* 
PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)¶ - Return value: Always NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilename(), с дополнительным параметром, указывающим тип создаваемого исключения.Availability: Windows.
 
- 
PyObject* 
PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)¶ - Return value: Always NULL.
Удобная функция для поднятия
ImportError. msg будет установлен в качестве строки сообщения исключения. name и path, оба из которых могут бытьNULL, будут установлены как соответствующийnameиpathатрибутыImportError.Добавлено в версии 3.3.
 
- 
void 
PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)¶ Задать информацию о файле, строки и смещении для текущего исключения. Если текущее исключение не является
SyntaxError, то оно устанавливает дополнительные атрибуты, которые заставляют подсистему печати исключений думать, что исключение являетсяSyntaxError.Добавлено в версии 3.4.
- 
void 
PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)¶ Подобно
PyErr_SyntaxLocationObject(), но filename является байтовой строкой, декодированной из кодировки файловой системы (os.fsdecode()).Добавлено в версии 3.2.
- 
void 
PyErr_SyntaxLocation(const char *filename, int lineno)¶ Как и
PyErr_SyntaxLocationEx(), но параметр col_offset пропущен.
- 
void 
PyErr_BadInternalCall()¶ Сокращение для
PyErr_SetString(PyExc_SystemError, message), где message указывает, что внутренняя операция (например, функция Python/C API) была вызвана с недопустимым аргументом. В основном для внутреннего использования.
Выдача предупреждений¶
Функции используются для выдачи предупреждений из C кода. Они
отражают аналогичные функции, экспортируемые модулем Python warnings.
Обычно они печатают предупреждающее сообщение для sys.stderr; однако также
возможно, что пользователь указал, что предупреждения должны быть превращены в
ошибки, и в этом случае они вызовут исключение. Также возможно, что эти функции
вызывают исключение из-за проблемы с механизмом предупреждения. Возвращает
значение - 0, если никакое исключение не поднято, или -1,
если исключение поднято. (Невозможно определить, действительно ли напечатано
предупреждающее сообщение, и какова причина исключения; это намеренно.) Если
возникает исключение, вызывающий должен выполнить обычную обработку
исключения (например, Py_DECREF() собственные ссылки и возвращает ошибку
значение).
- 
int 
PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)¶ Вернуть предупреждающее сообщение. Аргумент category представляет собой категорию предупреждения (см. ниже) или
NULL; аргумент message является UTF-8 кодированный строкой. stack_level - положительное число, дающее число кадров стека; предупреждение будет выдано из текущей строки кода в этом стеке фрейма. stack_level 1 - это функция, вызывающаяPyErr_WarnEx(), 2 - функция выше, и так далее.Категории предупреждений должны быть подклассами
PyExc_Warning;PyExc_Warningявляется подклассPyExc_Exception; категория предупреждения по умолчанию -PyExc_RuntimeWarning. Стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых перечисляются в Стандартные категории предупреждений.Для получения информации об управлении предупреждениями см. документацию по модулю
warningsи опции-Wв документации к командной строке. Отсутствует C API для управления предупреждениями.
- 
PyObject* 
PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)¶ - Return value: Always NULL.
Очень походит на
PyErr_SetImportError(), но функция позволяет задать подклассImportErrorдля поднятия.Добавлено в версии 3.6.
 
- 
int 
PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)¶ Вернуть предупреждающее сообщение с явным управлением всеми предупреждающими атрибутами. Это просто обертка вокруг Python функции
warnings.warn_explicit(), см. здесь же для получения дополнительной информации. Аргументы module и registry могут быть установлены вNULL, чтобы получить описанный здесь эффект по умолчанию.Добавлено в версии 3.4.
- 
int 
PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)¶ Аналогично
PyErr_WarnExplicitObject()за исключением того, что message и module являются UTF-8 кодированная строка, и filename декодируется из кодировки файловой системы (os.fsdecode()).
- 
int 
PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...)¶ Функция аналогична функции
PyErr_WarnEx(), но использует функциюPyUnicode_FromFormat()для форматирования предупреждающего сообщения. format - это ASCII-кодированная строка.Добавлено в версии 3.2.
- 
int 
PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...)¶ Функция похожа на
PyErr_WarnFormat(), но categoryResourceWarningи передается source вwarnings.WarningMessage().Добавлено в версии 3.6.
Запрос индикатора ошибки¶
- 
PyObject* 
PyErr_Occurred()¶ - Return value: Borrowed reference.
Проверить, установлен ли индикатор ошибки. Если установлен, возвращает type исключения (первый аргумент для последнего вызова одной из
PyErr_Set*()функций илиPyErr_Restore()). Если не установлен, возвращаетNULL. Ссылка на возвращаемое значение не принадлежит, поэтому ееPy_DECREF()не требуется.Примечание
Не сравнивать возвращаемое значение с определенным исключением; вместо этого используйте
PyErr_ExceptionMatches(), как показано ниже. (Сравнение может быть легко ошибочным, так как исключение может быть сущностью вместо класса, в случае исключения класса, или это может быть подкласс ожидаемого исключения.) 
- 
int 
PyErr_ExceptionMatches(PyObject *exc)¶ Эквивалентно
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc). Она должна вызываться только в том случае, если действительно установлена особая ситуация; произойдет нарушение доступа к памяти, если исключение не возникло.
- 
int 
PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)¶ Возвращает true, если given исключение соответствует типу исключения в exc. Если exc является объектом класса, также возвращает true, когда given является сущностью подкласса. Если exc является кортежем, для соответствия найденных всех типов исключений в кортеже (и рекурсивно в субкортежах).
- 
void 
PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)¶ Извлечь индикатор ошибки в три переданные переменные адреса. Если индикатор ошибки не установлен, установить для всех трех переменных значений
NULL. Если он установлен, он будет очищен, и вы будете владеть ссылкой на каждый извлеченный объект. Объект значение и трейсбэк может бытьNULL, даже если объект типа не является объектом.Примечание
Функция, как правило, использует только код, которому необходимо перехватить исключения, или код, которому необходимо временно сохранить и восстановить индикатор ошибки, например,:
{ PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); /* ... код, который может вызывать другие ошибки ... */ PyErr_Restore(type, value, traceback); }
- 
void 
PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)¶ Установить индикатор ошибки из трех объектов. Если индикатор ошибки уже установлен, он сначала сбрасывается. Если объекты
NULL, индикатор ошибки сбрасывается. Не передавать типNULLи не-NULLзначение или трейсбэк. Тип исключения должен быть классом. Не передавайте недопустимый тип исключения или значение. (Нарушение этих правил вызовет тонкие проблемы позже.) Этот вызов удаляет ссылку на каждый объект: вы должны владеть ссылкой на каждый объект до вызова и после вызова вы больше не владеете этими ссылками. (Если вы этого не понимаете, не использует эту функцию. Я вас предупредил.)Примечание
Функция обычно использует только код, которому необходимо временно сохранить и восстановить индикатор ошибки. Используйте
PyErr_Fetch()для сохранения текущего индикатора ошибки.
- 
void 
PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)¶ При определенных обстоятельствах значения, возвращенные
PyErr_Fetch()ниже, может быть «ненормализованным», что означает, что*excявляется объектом класса, но*valне является сущность того же класса. Эту функцию можно используемый для создания экземпляра класса в этом случае. Если значения уже нормализованы, ничего не происходит. Задержанная нормализация реализуется для улучшения рабочих характеристик.Примечание
Функция неявно не устанавливает
__traceback__атрибут на значение исключения. Если требуется установить трейсбэк соответствующим образом, необходим следующий дополнительный фрагмент:if (tb != NULL) { PyException_SetTraceback(val, tb); }
- 
void 
PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)¶ Получение информации об исключении, известной из
sys.exc_info(). Это относится к исключению, которое было уже поймано, а не к исключению, которое было вновь поднято. Возвращает новые ссылки для трех объектов, любой из которых может бытьNULL. Не изменяет состояние информации об исключении.
Примечание
Функция обычно не используют код, который хочет обрабатывать
исключения. Скорее, его можно использовать, когда код нужно временно
сохранить и восстановить состояние исключения. Используйте PyErr_SetExcInfo() для
восстановления или удаления состояния исключений.
Добавлено в версии 3.3.
- 
void 
PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)¶ Установить информацию об исключении, как известно из
sys.exc_info(). Это относится к исключению, которое было уже поймано, а не к исключению, которое было вновь поднято. Функция крадет ссылки аргументов. Чтобы очистить состояние исключения, передайтеNULLдля всех трех аргументов. Общие правила о трех аргументах см. в разделеPyErr_Restore().Примечание
Функция обычно не используют код, который хочет обрабатывать исключения. Скорее, его можно использовать, когда код нужно временно сохранить и восстановить состояние исключения. Используйте
PyErr_GetExcInfo()для чтения состояние исключений.Добавлено в версии 3.3.
Обработка сигналов¶
- 
int 
PyErr_CheckSignals()¶ Функция взаимодействует с Python обработкой сигналов. Он проверяет, был ли сигнал послан в процессы, и, если да, вызывает соответствующий сигнал обработчика. Если модуль
signalподдерживается, он может вызвать сигнал обработчика записанный в Python. Во всех случаях результатом по умолчанию дляSIGINTявляется созданиеKeyboardInterruptисключения. При возникновении исключения устанавливается индикатор ошибки и функция возвращает-1; в противном случае функция возвращает0. Индикатор ошибки может быть сброшен, если он был установлен ранее.
- 
void 
PyErr_SetInterrupt()¶ Смоделировать эффект поступления сигнала
SIGINT. При следующем вызовеPyErr_CheckSignals()будет вызван сигнал Python обработчика дляSIGINT.Если
SIGINTне обрабатывается Python (было установлено значениеsignal.SIG_DFLилиsignal.SIG_IGN), Функция ничего не делает.
- 
int 
PySignal_SetWakeupFd(int fd)¶ Утилита определяет файловый дескриптор, в который записывается номер сигнала в виде одного байта при каждом приеме сигнала. fd должны быть неблокирующими. Он возвращает предыдущий такой же файловый дескриптор.
Значение
-1отключает функцию; это начальный состояние. Это эквивалентноsignal.set_wakeup_fd()в Python, но без какой-либо проверки ошибок. fd должен быть допустимым файловым дескриптором. Функцию следует вызывать только из основного потока.Изменено в версии 3.5: В Windows функция теперь также поддерживает сокетные дескрипторы.
Классы исключений¶
- 
PyObject* 
PyErr_NewException(const char *name, PyObject *base, PyObject *dict)¶ - Return value: New reference.
Служебная функция создает и возвращает новый класс исключений. Аргумент name должен быть именем нового исключения, C строкой формы
module.classname. Аргументы base и dict обычноNULL. При этом создается объект класса, производный отException(доступный в C какPyExc_Exception).__module__атрибут нового класса устанавливается в первую часть (до последней точки) аргумента name, а имя класса устанавливается в последнюю часть (после последней точки). Аргумент base можно использовать для указания альтернативных базовых классов; может быть только один класс или кортеж классов. Аргумент dict можно использовать для указания словаря переменных и методов класса. 
- 
PyObject* 
PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)¶ - Return value: New reference.
То же, что и
PyErr_NewException(), за исключением того, что новый класс исключения может быть легко присвоен докстрингу: если doc является не-NULL, он будет использоваться как докстринг для класса исключения.Добавлено в версии 3.2.
 
Объекты исключения¶
- 
PyObject* 
PyException_GetTraceback(PyObject *ex)¶ - Return value: New reference.
Возвращает трейсбэк, связанные с исключением, в качестве новой ссылки, доступной с Python по
__traceback__. Если трейсбэк не связан, возвращаетNULL. 
- 
int 
PyException_SetTraceback(PyObject *ex, PyObject *tb)¶ Установить для трейсбэк, связанного с исключением, значение tb. Используйте
Py_None, чтобы очистить его.
- 
PyObject* 
PyException_GetContext(PyObject *ex)¶ - Return value: New reference.
Возвращает контекст (еще одну сущность исключения во время обработки которого был поднят ex), связанный с исключением, в качестве новой ссылки, доступной с Python по
__context__. Если контекст не связан, это возвращаетNULL. 
- 
void 
PyException_SetContext(PyObject *ex, PyObject *ctx)¶ Установить для контекста, связанного с исключением, значение ctx. Используйте
NULL, чтобы очистить его. Нет проверки типа, чтобы убедиться, что ctx является сущность исключения. Крадёт ссылку на ctx.
- 
PyObject* 
PyException_GetCause(PyObject *ex)¶ - Return value: New reference.
Возвращает причину (либо сущность исключения, либо
None, заданнуюraise ... from ...), связанную с исключением, как новую ссылку, доступную с Python по__cause__. 
- 
void 
PyException_SetCause(PyObject *ex, PyObject *cause)¶ Установить причину, связанную с исключением, в значение cause. Используйте
NULL, чтобы очистить его. Нет проверки типа, чтобы убедиться, что cause является сущностью исключения илиNone. Крадёт ссылку на cause.Функция неявно устанавливает для
__suppress_context__значениеTrue.
Объекты исключения Юникода¶
Следующие функции используются для создания и изменения Юникод исключений из C.
- 
PyObject* 
PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)¶ - Return value: New reference.
Создать объект
UnicodeDecodeErrorс атрибутами encoding, object, length, start, end и reason. encoding и reason - это UTF-8 кодированная строка. 
- 
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)¶ - Return value: New reference.
Создать объект
UnicodeEncodeErrorс атрибуты encoding, object, length, start, end и reason. encoding и reason - это UTF-8 кодированная строка.Не рекомендуется, начиная с версии 3.3: 3.11
Py_UNICODEустарел, начиная с Python 3.3. Пожалуйста, перейдите наPyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnns", ...). 
- 
PyObject* 
PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)¶ - Return value: New reference.
Создать объект
UnicodeTranslateErrorс атрибуты object, length, start, end и reason. reason - это UTF-8 кодированный строка.Не рекомендуется, начиная с версии 3.3: 3.11
Py_UNICODEустарел, начиная с Python 3.3. Пожалуйста, перейдите наPyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns", ...). 
- 
PyObject* 
PyUnicodeDecodeError_GetEncoding(PyObject *exc)¶ - 
PyObject* 
PyUnicodeEncodeError_GetEncoding(PyObject *exc)¶ - Return value: New reference.
Возвращает encoding атрибут данного объекта исключения.
 
- 
PyObject* 
PyUnicodeDecodeError_GetObject(PyObject *exc)¶ - 
PyObject* 
PyUnicodeEncodeError_GetObject(PyObject *exc) PyObject* PyUnicodeTranslateError_GetObject(PyObject *exc)¶ - Return value: New reference.
Возвращает object атрибут данного объекта исключения.
 
- 
int 
PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)¶ - 
int 
PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)¶ - 
int 
PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)¶ Получить start атрибут данного объекта исключения и поместите его в *start. start не должны быть
NULL. Возвращает0на успех,-1при неудаче.
- 
int 
PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)¶ - 
int 
PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)¶ - 
int 
PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)¶ Установить значение start атрибут данного объекта исключения равным start. Возвращает
0при успехе,-1при неудаче.
- 
int 
PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)¶ - 
int 
PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)¶ - 
int 
PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)¶ Получить end атрибут данного объекта исключения и поместите его в *end. end не должны быть
NULL. Возвращает0при успехе,-1при неудаче.
- 
int 
PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)¶ - 
int 
PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)¶ - 
int 
PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)¶ Установить значение end атрибут данного объекта исключения равным end. Возвращает
0при успехе,-1при неудаче.
- 
PyObject* 
PyUnicodeDecodeError_GetReason(PyObject *exc)¶ - 
PyObject* 
PyUnicodeEncodeError_GetReason(PyObject *exc)¶ - 
PyObject* 
PyUnicodeTranslateError_GetReason(PyObject *exc)¶ - Return value: New reference.
Возвращает reason атрибута данного объекта исключения.
 
- 
int 
PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)¶ - 
int 
PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)¶ - 
int 
PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)¶ Установить значение reason атрибут данного объекта исключения равным reason. Возвращает
0при успехе,-1при неудаче.
Управление рекурсией¶
Две функции обеспечивают способ выполнения безопасных рекурсивных вызовов на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает Python код (который отслеживает его глубину рекурсии автоматически).
- 
int 
Py_EnterRecursiveCall(const char *where)¶ Отмечает точку, в которой должен быть выполнен рекурсивный вызов C-уровня.
Если
USE_STACKCHECKопределена, функция проверяет переполнение стека ОС с помощьюPyOS_CheckStack(). В этом случае она устанавливаетMemoryErrorи возвращает ненулевое значение.Затем функция проверяет, достигнут ли предел рекурсии. В этом случае устанавливается
RecursionErrorи возвращается ненулевое значение. В противном случае ноль равен возвращенному.where должно быть строка, например,
" in instance check", которая должна быть связана сRecursionErrorсообщением, вызванным пределом глубины рекурсии.
- 
void 
Py_LeaveRecursiveCall()¶ Заканчивается
Py_EnterRecursiveCall(). Должен вызываться один раз для каждого успешного вызоваPy_EnterRecursiveCall().
Для правильной реализации tp_repr для типов контейнеров требуется специальная
рекурсивная обработка. Помимо защиты стека, tp_repr также необходимо
отслеживать объекты для предотвращения циклов. Следующие две функции упрощают
эту функцию. Фактически, это C эквивалент reprlib.recursive_repr().
- 
int 
Py_ReprEnter(PyObject *object)¶ Вызывается в начале реализации
tp_reprдля обнаружения циклов.Если объект уже обработан, функция возвращает положительное целое число. В этом случае реализация
tp_reprдолжна возвратить объект строку, указывающим цикл. Как примеры,dictвозражает{...}, иlistвозражает[...].Функция возвращает отрицательное целое число, если достигнут предел рекурсии. В этом случае реализация
tp_reprобычно должна возвращатьNULL.В противном случае функция возвращает нуль, и реализация
tp_reprможет продолжаться нормально.
- 
void 
Py_ReprLeave(PyObject *object)¶ Завершить
Py_ReprEnter(). Должен вызываться один раз для каждого вызоваPy_ReprEnter(), который возвращает нуль.
Стандартные исключения¶
Все стандартные исключения Python доступны в виде глобальных переменных, за
именами которых PyExc_ следует имя исключения Python. Они имеют тип
PyObject*; все они являются объектами класса. Для полноты, далее приведены все
переменные:
| C имя | Python имя | Прим. | 
|---|---|---|
PyExc_BaseException | 
BaseException | 
(1) | 
PyExc_Exception | 
Exception | 
(1) | 
PyExc_ArithmeticError | 
ArithmeticError | 
(1) | 
PyExc_AssertionError | 
AssertionError | 
|
PyExc_AttributeError | 
AttributeError | 
|
PyExc_BlockingIOError | 
BlockingIOError | 
|
PyExc_BrokenPipeError | 
BrokenPipeError | 
|
PyExc_BufferError | 
BufferError | 
|
PyExc_ChildProcessError | 
ChildProcessError | 
|
PyExc_ConnectionAbortedError | 
ConnectionAbortedError | 
|
PyExc_ConnectionError | 
ConnectionError | 
|
PyExc_ConnectionRefusedError | 
ConnectionRefusedError | 
|
PyExc_ConnectionResetError | 
ConnectionResetError | 
|
PyExc_EOFError | 
EOFError | 
|
PyExc_FileExistsError | 
FileExistsError | 
|
PyExc_FileNotFoundError | 
FileNotFoundError | 
|
PyExc_FloatingPointError | 
FloatingPointError | 
|
PyExc_GeneratorExit | 
GeneratorExit | 
|
PyExc_ImportError | 
ImportError | 
|
PyExc_IndentationError | 
IndentationError | 
|
PyExc_IndexError | 
IndexError | 
|
PyExc_InterruptedError | 
InterruptedError | 
|
PyExc_IsADirectoryError | 
IsADirectoryError | 
|
PyExc_KeyError | 
KeyError | 
|
PyExc_KeyboardInterrupt | 
KeyboardInterrupt | 
|
PyExc_LookupError | 
LookupError | 
(1) | 
PyExc_MemoryError | 
MemoryError | 
|
PyExc_ModuleNotFoundError | 
ModuleNotFoundError | 
|
PyExc_NameError | 
NameError | 
|
PyExc_NotADirectoryError | 
NotADirectoryError | 
|
PyExc_NotImplementedError | 
NotImplementedError | 
|
PyExc_OSError | 
OSError | 
(1) | 
PyExc_OverflowError | 
OverflowError | 
|
PyExc_PermissionError | 
PermissionError | 
|
PyExc_ProcessLookupError | 
ProcessLookupError | 
|
PyExc_RecursionError | 
RecursionError | 
|
PyExc_ReferenceError | 
ReferenceError | 
(2) | 
PyExc_RuntimeError | 
RuntimeError | 
|
PyExc_StopAsyncIteration | 
StopAsyncIteration | 
|
PyExc_StopIteration | 
StopIteration | 
|
PyExc_SyntaxError | 
SyntaxError | 
|
PyExc_SystemError | 
SystemError | 
|
PyExc_SystemExit | 
SystemExit | 
|
PyExc_TabError | 
TabError | 
|
PyExc_TimeoutError | 
TimeoutError | 
|
PyExc_TypeError | 
TypeError | 
|
PyExc_UnboundLocalError | 
UnboundLocalError | 
|
PyExc_UnicodeDecodeError | 
UnicodeDecodeError | 
|
PyExc_UnicodeEncodeError | 
UnicodeEncodeError | 
|
PyExc_UnicodeError | 
UnicodeError | 
|
PyExc_UnicodeTranslateError | 
UnicodeTranslateError | 
|
PyExc_ValueError | 
ValueError | 
|
PyExc_ZeroDivisionError | 
ZeroDivisionError | 
Добавлено в версии 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
and PyExc_TimeoutError were introduced following PEP 3151.
Добавлено в версии 3.5: PyExc_StopAsyncIteration и PyExc_RecursionError.
Добавлено в версии 3.6: PyExc_ModuleNotFoundError.
Это псевдонимы для совместимости  PyExc_OSError:
| C имя | Прим. | 
|---|---|
PyExc_EnvironmentError | 
|
PyExc_IOError | 
|
PyExc_WindowsError | 
(3) | 
Изменено в версии 3.3: Эти псевдонимы используемый быть отдельными типами исключений.
Примечания:
- Это базовый класс для других стандартных исключений.
 - Определяется только в Windows; защитите код, использующий эту функцию,
проверив, что определен 
MS_WINDOWSмакрос препроцессора. 
Стандартные категории предупреждений¶
Все стандартные категории предупреждений Python доступны в виде глобальных
переменных, за именами которых PyExc_ следует имя исключения Python.
Они имеют тип PyObject*; все они являются объектами класса. Для полноты далее перечислены
все переменные:
| C имя | Python имя | Прим. | 
|---|---|---|
PyExc_Warning | 
Warning | 
(1) | 
PyExc_BytesWarning | 
BytesWarning | 
|
PyExc_DeprecationWarning | 
DeprecationWarning | 
|
PyExc_FutureWarning | 
FutureWarning | 
|
PyExc_ImportWarning | 
ImportWarning | 
|
PyExc_PendingDeprecationWarning | 
PendingDeprecationWarning | 
|
PyExc_ResourceWarning | 
ResourceWarning | 
|
PyExc_RuntimeWarning | 
RuntimeWarning | 
|
PyExc_SyntaxWarning | 
SyntaxWarning | 
|
PyExc_UnicodeWarning | 
UnicodeWarning | 
|
PyExc_UserWarning | 
UserWarning | 
Добавлено в версии 3.2: PyExc_ResourceWarning.
Примечания:
- Это базовый класс для других стандартных категорий предупреждений.
 
