Обработка исключений
Функции, описанные в этой главе, позволят вам обрабатывать и генерировать исключения Python. Важно понять некоторые основы обработки исключений в Python. Это работает примерно так же, как переменная POSIX errno: существует глобальный индикатор (на нить потока) последней произошедшей ошибки. Большинство функций C API не очищают его при успешном выполнении, но устанавливают его, чтобы указать причину ошибки при неудачном выполнении. Большинство функций C API также возвращают индикатор ошибки, обычно 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, ...) -
Значение возврата: всегда NULL.
Эта функция устанавливает индикатор ошибки и возвращает
NULL. exception должен быть классом исключения Python. format и последующие параметры помогают отформатировать сообщение об ошибке; они имеют то же значение и те же значения, что и вPyUnicode_FromFormat(). format — строка в кодировке ASCII.
-
PyObject* PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) -
Значение возврата: всегда NULL.
Аналогично
PyErr_Format(), но принимает аргументva_listвместо переменного числа аргументов.Добавлена в версии 3.5.
-
void PyErr_SetNone(PyObject *type) -
Это сокращение для
PyErr_SetObject(type, Py_None).
-
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.
-
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в документации командной строки. API C для управления предупреждениями отсутствует.
-
PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path) -
Значение возврата: Всегда 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(), но category —ResourceWarningи она передает source вwarnings.WarningMessage().Добавлен в версии 3.6.
Обращение к индикатору ошибки
-
PyObject* PyErr_Occurred() -
Возвращаемое значение: Заимствованная ссылка.
Проверка, установлено ли значение индикатора ошибки. Если установлено, возвращает тип исключения (первый аргумент последнего вызова одной из функций
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, если указанное исключение соответствует типу исключения в 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); /* ... code that might produce other errors ... */ 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) -
Возвращаемое значение: Новая ссылка.
Эта служебная функция создаёт и возвращает новый класс исключений. Аргумент 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.
Объекты исключений
-
PyObject* PyException_GetTraceback(PyObject *ex) -
Значение результата: Новая ссылка.
Возвращает стек отладки, связанный с исключением, как новую ссылку, доступную в Python через
__traceback__. Если стека отладки нет, возвращаетNULL.
-
int PyException_SetTraceback(PyObject *ex, PyObject *tb) -
Устанавливает стек отладки, связанный с исключением, на 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 из 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при неудаче.
Управление рекурсией
Эти две функции предоставляют способ выполнения безопасных рекурсивных вызовов на уровне C, как в ядре, так и в модулях расширений. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает глубину рекурсии).
-
int Py_EnterRecursiveCall(const char *where) -
Помечает точку, где собирается выполнить рекурсивный вызов на уровне C.
Если
USE_STACKCHECKопределено, эта функция проверяет, произошел ли переполнение стека ОС с помощьюPyOS_CheckStack(). В этом случае она устанавливаетMemoryErrorи возвращает ненулевое значение.Затем функция проверяет, достигнута ли предельная глубина рекурсии. Если это так, устанавливается
RecursionError, и возвращается ненулевое значение. В противном случае возвращается ноль.где должно быть строкой, например,
" 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 | Примечания |
|---|---|---|
| (1) | |
| (1) | |
| (1) | |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| (1) | |
| ||
| ||
| ||
| ||
| ||
| (1) | |
| ||
| ||
| ||
| ||
| (2) | |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
Новые в версии 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.3: Эти псевдонимы раньше были отдельными типами исключений.
Примечания:
- Это базовый класс для других стандартных исключений.
- Определен только в Windows; защитите код, использующий его, проверив, что препроцессорная макрос
MS_WINDOWSопределён.
Стандартные категории предупреждений
Все стандартные категории предупреждений Python доступны как глобальные переменные, имена которых PyExc_ следуют за именем исключения Python. Они имеют тип PyObject*; все они — объекты классов. Для полноты, вот все переменные:
Имя в C | Имя в Python | Примечания |
|---|---|---|
| (1) | |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
Новые в версии 3.2: PyExc_ResourceWarning.
Примечания:
- Это базовый класс для других стандартных категорий предупреждений.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/c-api/exceptions.html