Содержание страницы
Обработка исключений¶Exception Handling
Функции, описанные в этой главе, позволяют обрабатывать и возбуждать исключения Python. Важно понимать некоторые основы обработки исключений Python. Она работает примерно как переменная errno в POSIX: существует глобальный индикатор (на поток) последней произошедшей ошибки. Большинство функций C API не очищают его при успехе, но устанавливают его, чтобы указать причину ошибки при неудаче. Большинство функций C API также возвращают индикатор ошибки, обычно NULL, если они должны вернуть указатель, или -1, если они возвращают целое число (исключение: функции PyArg_*() возвращают 1 при успехе и 0 при неудаче).
Конкретно, индикатор ошибки состоит из трех указателей на объекты: тип исключения, значение исключения и объект трассировки. Любой из этих указателей может быть NULL, если не установлен (хотя некоторые комбинации запрещены, например, нельзя иметь не-NULL трассировку, если тип исключения NULL).
Когда функция должна завершиться ошибкой, потому что вызванная ей функция завершилась ошибкой, она обычно не устанавливает индикатор ошибки; его уже установила вызванная функция. Она отвечает либо за обработку ошибки и очистку исключения, либо за возврат после освобождения всех удерживаемых ресурсов (таких как ссылки на объекты или выделенная память); она не должна продолжать нормальное выполнение, если не готова обработать ошибку. При возврате из-за ошибки важно указать вызывающему коду, что ошибка была установлена. Если ошибка не обрабатывается или не аккуратно распространяется, последующие вызовы Python/C API могут вести себя не так, как задумано, и могут отказать загадочным образом.
Примечание
Индикатор ошибки не является результатом sys.exc_info(). Первый соответствует исключению, которое еще не перехвачено (и поэтому все еще распространяется), тогда как второй возвращает исключение после его перехвата (и поэтому прекратило распространение).
Печать и очистка¶Printing and clearing
-
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.
При вызове этой функции должно быть установлено исключение.
Возбуждение исключений¶Raising exceptions
Эти функции помогают установить индикатор ошибки текущего потока.
Для удобства некоторые из этих функций всегда возвращают указатель 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, ...)¶ - Возвращаемое значение: всегда NULL.
Эта функция устанавливает индикатор ошибки и возвращает
NULL. исключение должен быть классом исключения Python. Параметры format и последующие помогают форматировать сообщение об ошибке; они имеют тот же смысл и значения, что и вPyUnicode_FromFormat(). format – это строка в кодировке ASCII.
-
PyObject*
PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)¶ - Возвращаемое значение: всегда NULL.
То же, что и
PyErr_Format(), но принимает аргументva_listвместо переменного числа аргументов.Новое в версии 3.5.
-
int
PyErr_BadArgument()¶ Это сокращение для
PyErr_SetString(PyExc_TypeError, message), где message указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном предназначено для внутреннего использования.
-
PyObject*
PyErr_NoMemory()¶ - Возвращаемое значение: всегда NULL.
Это сокращение для
PyErr_SetNone(PyExc_MemoryError); оно возвращаетNULL, чтобы функция выделения объекта могла написатьreturn PyErr_NoMemory();, когда заканчивается память.
-
PyObject*
PyErr_SetFromErrno(PyObject *type)¶ - Возвращаемое значение: всегда NULL.
Это удобная функция для возбуждения исключения, когда функция библиотеки C вернула ошибку и установила переменную C
errno. Она создает объект кортежа, первый элемент которого – целочисленное значениеerrno, а второй – соответствующее сообщение об ошибке (полученное изstrerror()), а затем вызываетPyErr_SetObject(type, object). В Unix, когда значениеerrnoравноEINTR, что указывает на прерванный системный вызов, эта функция вызываетPyErr_CheckSignals(), и если та устанавливает индикатор ошибки, оставляет его установленным на это. Функция всегда возвращаетNULL, так что функция-обертка вокруг системного вызова может написатьreturn PyErr_SetFromErrno(type);, когда системный вызов возвращает ошибку.
-
PyObject*
PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromErrno(), с тем дополнением, что если filenameObject не равноNULL, он передаётся конструктору type в качестве третьего параметра. В случае исключенияOSErrorэто используется для задания атрибутаfilenameэкземпляра исключения.
-
PyObject*
PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromErrnoWithFilenameObject(), но принимает второй объект имени файла; используется для возбуждения ошибок, когда функция, принимающая два имени файла, завершается неудачей.Новое в версии 3.4.
-
PyObject*
PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromErrnoWithFilenameObject(), но имя файла задаётся как C-строка. filename декодируется из кодировки файловой системы (os.fsdecode()).
-
PyObject*
PyErr_SetFromWindowsErr(int ierr)¶ - Возвращаемое значение: всегда NULL.
Это вспомогательная функция для возбуждения
WindowsError. Если вызвана с ierr равным0, вместо него используется код ошибки, возвращаемый вызовомGetLastError(). Она вызывает функцию Win32FormatMessage()для получения описания кода ошибки Windows, заданного ierr илиGetLastError(), затем создаёт кортеж, первый элемент которого – значение ierr, а второй – соответствующее сообщение об ошибке (полученное изFormatMessage()), и после этого вызываетPyErr_SetObject(PyExc_WindowsError, object). Эта функция всегда возвращаетNULL.Доступность: Windows.
-
PyObject*
PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromWindowsErr(), с дополнительным параметром, указывающим тип возбуждаемого исключения.Доступность: Windows.
-
PyObject*
PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilenameObject(), но имя файла передаётся как C-строка. filename декодируется из кодировки файловой системы (os.fsdecode()).Доступность: Windows.
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilenameObject(), с дополнительным параметром, указывающим тип возбуждаемого исключения.Доступность: Windows.
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetExcFromWindowsErrWithFilenameObject(), но принимает второй объект имени файла.Доступность: Windows.
Новое в версии 3.4.
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)¶ - Возвращаемое значение: всегда NULL.
Аналогично
PyErr_SetFromWindowsErrWithFilename(), с дополнительным параметром, указывающим тип возбуждаемого исключения.Доступность: Windows.
-
PyObject*
PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)¶ - Возвращаемое значение: всегда NULL.
Это удобная функция для возбуждения
ImportError. msg будет установлен как строка сообщения исключения. name и path, оба могут бытьNULL, будут установлены как соответствующие атрибутыImportError:nameиpath.Новое в версии 3.3.
-
PyObject*
PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)¶ - Возвращаемое значение: всегда NULL.
Очень похожа на
PyErr_SetImportError(), но эта функция позволяет указать подклассImportErrorдля возбуждения.Новое в версии 3.6.
-
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) была вызвана с недопустимым аргументом. Предназначено в основном для внутреннего использования.
Выдача предупреждений¶Issuing warnings
Используйте эти функции для выдачи предупреждений из кода на 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в документации командной строки. API для управления предупреждениями на C не существует.
-
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(), но category равенResourceWarning, и она передаёт source вwarnings.WarningMessage().Новое в версии 3.6.
Опрос индикатора ошибки¶Querying the error indicator
-
PyObject*
PyErr_Occurred()¶ - Возвращаемое значение: заимствованная ссылка.
Проверяет, установлен ли индикатор ошибки. Если установлен, возвращает тип исключения (первый аргумент последнего вызова одной из функций
PyErr_Set*()илиPyErr_Restore()). Если не установлен, возвращаетNULL. Вы не владеете ссылкой на возвращаемое значение, поэтому вам не нужноPy_DECREF()его.Вызывающий должен удерживать GIL.
Примечание
Не сравнивайте возвращаемое значение с конкретным исключением; используйте вместо этого
PyErr_ExceptionMatches(), как показано ниже. (Сравнение может легко не сработать, так как исключение может быть экземпляром, а не классом (в случае классового исключения) или подклассом ожидаемого исключения.)
-
int
PyErr_ExceptionMatches(PyObject *exc)¶ Эквивалентно
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc). Эту функцию следует вызывать только тогда, когда исключение действительно установлено; при отсутствии возбуждённого исключения произойдёт нарушение доступа к памяти.
-
int
PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)¶ Возвращает истину, если заданное исключение соответствует типу исключения в exc. Если exc – объект класса, также возвращает истину, когда given является экземпляром подкласса. Если exc – кортеж, производится поиск соответствия среди всех типов исключений в кортеже (и рекурсивно во вложенных кортежах).
-
void
PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)¶ Извлекает индикатор ошибки в три переменные, чьи адреса передаются. Если индикатор ошибки не установлен, устанавливает все три переменные в
NULL. Если он установлен, он будет очищен, и вы получаете владение ссылкой на каждый извлеченный объект. Объекты value и traceback могут иметь значениеNULL, даже если объект type – нет.Примечание
Обычно эта функция используется только в коде, которому требуется перехватывать исключения, или в коде, которому нужно временно сохранять и восстанавливать индикатор ошибки. Например:
{ 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__значения исключения. Если требуется корректно установить 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.
Обработка сигналов¶Signal Handling
-
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 функция теперь также поддерживает дескрипторы сокетов.
Классы исключений¶Exception Classes
-
PyObject*
PyErr_NewException(const char *name, PyObject *base, PyObject *dict)¶ - Возвращаемое значение: новая ссылка.
Эта вспомогательная функция создаёт и возвращает новый класс исключения. Аргумент 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)¶ - Возвращаемое значение: новая ссылка.
То же, что и
PyErr_NewException(), за исключением того, что новому классу исключения можно легко задать докстринг: если doc неNULL, он будет использоваться в качестве докстринга класса исключения.Новое в версии 3.2.
Объекты исключений¶Exception Objects
-
PyObject*
PyException_GetTraceback(PyObject *ex)¶ - Возвращаемое значение: новая ссылка.
Возвращает новую ссылку на traceback, связанный с исключением, как доступно из Python через
__traceback__. Если связанный traceback отсутствует, возвращаетсяNULL.
-
int
PyException_SetTraceback(PyObject *ex, PyObject *tb)¶ Устанавливает traceback, связанный с исключением, в значение tb. Используйте
Py_None, чтобы очистить его.
-
PyObject*
PyException_GetContext(PyObject *ex)¶ - Возвращаемое значение: новая ссылка.
Возвращает новую ссылку на контекст (другой экземпляр исключения, во время обработки которого было возбуждено ex), связанный с исключением, как доступный из Python через
__context__. Если связанный контекст отсутствует, возвращаетсяNULL.
-
void
PyException_SetContext(PyObject *ex, PyObject *ctx)¶ Устанавливает контекст, связанный с исключением, в ctx. Для очистки используйте
NULL. Проверка типа, что ctx является экземпляром исключения, не выполняется. Эта функция перехватывает ссылку на ctx.
-
PyObject*
PyException_GetCause(PyObject *ex)¶ - Возвращаемое значение: новая ссылка.
Возвращает новую ссылку на причину (экземпляр исключения или
None, установленнуюraise ... from ...), связанную с исключением, как доступно из Python через__cause__.
-
void
PyException_SetCause(PyObject *ex, PyObject *cause)¶ Устанавливает причину, связанную с исключением, в cause. Для очистки используйте
NULL. Проверка типа, что cause является экземпляром исключения илиNone, не выполняется. Эта функция перехватывает ссылку на cause.Эта функция неявно устанавливает
__suppress_context__вTrue.
Объекты исключений Unicode¶Unicode Exception Objects
Следующие функции используются для создания и изменения исключений Unicode из 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)¶ - Возвращаемое значение: новая ссылка.
Создаёт объект
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)¶ - Возвращаемое значение: новая ссылка.
Создаёт объект
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)¶ - Возвращаемое значение: новая ссылка.
Создает объект
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)¶ - Возвращаемое значение: новая ссылка.
Возвращает атрибут encoding указанного объекта исключения.
-
PyObject*
PyUnicodeDecodeError_GetObject(PyObject *exc)¶ -
PyObject*
PyUnicodeEncodeError_GetObject(PyObject *exc)¶ -
PyObject*
PyUnicodeTranslateError_GetObject(PyObject *exc)¶ - Возвращаемое значение: новая ссылка.
Возвращает атрибут 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)¶ - Возвращаемое значение: новая ссылка.
Возвращает атрибут 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в случае ошибки.
Управление рекурсией¶Recursion Control
Эти две функции предоставляют способ безопасно выполнять рекурсивные вызовы на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает свою глубину рекурсии). Они также не нужны для реализаций tp_call, поскольку протокол вызова берёт на себя обработку рекурсии.
-
int
Py_EnterRecursiveCall(const char *where)¶ Отмечает точку, в которой будет выполнен рекурсивный вызов на уровне C.
Если определено
USE_STACKCHECK, эта функция проверяет, не переполнился ли стек ОС с помощьюPyOS_CheckStack(). Если это так, она устанавливаетMemoryErrorи возвращает ненулевое значение.Затем функция проверяет, достигнут ли предел рекурсии. Если это так, устанавливается
RecursionErrorи возвращается ненулевое значение. В противном случае возвращается ноль.where должна быть строкой в кодировке UTF-8, например
" in instance check", для добавления к сообщениюRecursionError, вызванному пределом глубины рекурсии.Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.
-
void
Py_LeaveRecursiveCall(void)¶ Завершает
Py_EnterRecursiveCall(). Должна вызываться один раз для каждого успешного вызоваPy_EnterRecursiveCall().Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.
Для правильной реализации tp_repr для контейнерных типов требуется
специальная обработка рекурсии. В дополнение к защите стека,
tp_repr также необходимо отслеживать объекты для предотвращения циклов.
Следующие две функции облегчают эту функциональность. По сути,
это эквивалент reprlib.recursive_repr() на C.
-
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(), которая возвращает ноль.
Стандартные исключения¶Standard Exceptions
Все стандартные исключения Python доступны в виде глобальных переменных, имена которых образуются из
PyExc_ с добавлением имени исключения Python. Они имеют тип
PyObject*; все они являются объектами-классами. Для полноты картины здесь приведены все
переменные:
Имя в C |
Имя в Python |
Примечания |
|---|---|---|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Новое в версии 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.
Новое в версии 3.5: PyExc_StopAsyncIteration и PyExc_RecursionError.
Новое в версии 3.6: PyExc_ModuleNotFoundError.
Это псевдонимы для совместимости с PyExc_OSError:
Имя в C |
Примечания |
|---|---|
|
|
|
|
|
Изменено в версии 3.3: Раньше эти псевдонимы были отдельными типами исключений.
Примечания:
Стандартные категории предупреждений¶Standard Warning Categories
Все стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых образуются из PyExc_ с добавлением имени исключения Python. Они имеют тип
PyObject*; все они являются объектами-классами. Для полноты картины здесь приведены все
переменные:
Имя в C |
Имя в Python |
Примечания |
|---|---|---|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Новое в версии 3.2: PyExc_ResourceWarning.
Примечания:
- 3
Это базовый класс для других стандартных категорий предупреждений.