Обработка исключений
Функции, описанные в этой главе, позволяют обрабатывать и вызывать исключения 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() -
Часть стабильного ABI.
Сбрасывает индикатор ошибки. Если индикатор ошибки не установлен, ничего не происходит.
-
void PyErr_PrintEx(int set_sys_last_vars) -
Часть стабильного ABI.
Выводит стандартную трассировку стека в
sys.stderrи сбрасывает индикатор ошибки. Однако, если ошибка являетсяSystemExit, трассировка стека не выводится, а процесс Python завершается с кодом ошибки, указанным в экземпляреSystemExit.Вызывайте эту функцию только при установленном индикаторе ошибки. В противном случае это приведёт к фатальной ошибке!
Если set_sys_last_vars не равен нулю, переменным
sys.last_type,sys.last_valueиsys.last_tracebackбудут присвоены соответственно тип, значение и трассировка стека выведенного исключения.
-
void PyErr_Print() -
Часть стабильного ABI.
Псевдоним для
PyErr_PrintEx(1).
-
void PyErr_WriteUnraisable(PyObject *obj) -
Часть стабильного ABI.
Вызывает
sys.unraisablehook()с текущим исключением и аргументом obj.Эта вспомогательная функция выводит предупреждение в
sys.stderr, когда исключение установлено, но интерпретатор не может фактически вызвать его. Например, она используется, когда исключение возникает в методе__del__().Функция вызывается с единственным аргументом obj, указывающим контекст, в котором возникло невызванное исключение. Если возможно, представление obj будет выведено в сообщении предупреждения.
При вызове этой функции должно быть установлено исключение.
Вызов исключений
Эти функции помогают установить индикатор ошибки текущего потока. Для удобства некоторые из них всегда возвращают указатель NULL, который можно использовать в инструкции return.
-
void PyErr_SetString(PyObject *type, const char *message) -
Часть стабильного ABI.
Это наиболее распространённый способ установить индикатор ошибки. Первый аргумент задаёт тип исключения; обычно это одно из стандартных исключений, например
PyExc_RuntimeError. Создавать новую сильную ссылку на него не требуется (например, с помощьюPy_INCREF()). Второй аргумент — сообщение об ошибке; оно декодируется из'utf-8'.
-
void PyErr_SetObject(PyObject *type, PyObject *value) -
Часть стабильного ABI.
Эта функция похожа на
PyErr_SetString(), но позволяет указать произвольный объект Python в качестве «значения» исключения.
-
PyObject *PyErr_Format(PyObject *exception, const char *format, ...) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI.
Эта функция устанавливает индикатор ошибки и возвращает
NULL. exception должен быть классом исключения Python. Параметр format и последующие параметры используются для форматирования сообщения об ошибке; они имеют то же значение и принимают те же значения, что и вPyUnicode_FromFormat(). format — это строка в кодировке ASCII.
-
PyObject *PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI начиная с версии 3.5.
Аналогична
PyErr_Format(), но принимает аргумент типаva_listвместо переменного числа аргументов.Добавлено в версии 3.5.
-
void PyErr_SetNone(PyObject *type) -
Часть стабильного ABI.
Это сокращённая форма записи для
PyErr_SetObject(type, Py_None).
-
int PyErr_BadArgument() -
Часть стабильного ABI.
Это сокращённая форма записи для
PyErr_SetString(PyExc_TypeError, message), где message указывает, что встроенная операция была вызвана с недопустимым аргументом. В основном предназначена для внутреннего использования.
-
PyObject *PyErr_NoMemory() -
Возвращаемое значение: всегда NULL.Часть стабильного ABI.
Это сокращённая форма записи для
PyErr_SetNone(PyExc_MemoryError); функция возвращаетNULL, чтобы функция выделения объекта могла вернутьreturn PyErr_NoMemory();при нехватке памяти.
-
PyObject *PyErr_SetFromErrno(PyObject *type) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI.
Эта вспомогательная функция вызывает исключение, когда функция библиотеки 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.Часть стабильного ABI.
Похожа на
PyErr_SetFromErrno(), но дополнительно, если filenameObject не равенNULL, передаёт его конструктору type в качестве третьего параметра. Для исключенияOSErrorон используется для задания атрибутаfilenameэкземпляра исключения.
-
PyObject *PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI начиная с версии 3.7.
Похожа на
PyErr_SetFromErrnoWithFilenameObject(), но принимает второй объект имени файла для вызова исключений в случае сбоя функции, принимающей два имени файла.Добавлено в версии 3.4.
-
PyObject *PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI.
Похожа на
PyErr_SetFromErrnoWithFilenameObject(), но имя файла задаётся в виде строки C. filename декодируется с использованием кодировки файловой системы и обработчика ошибок.
-
PyObject *PyErr_SetFromWindowsErr(int ierr) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI в Windows начиная с версии 3.7.
Это вспомогательная функция для вызова
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.Часть стабильного ABI в Windows начиная с версии 3.7.
Аналогична
PyErr_SetFromWindowsErr(), но принимает дополнительный параметр, задающий тип вызываемого исключения.Доступность: Windows.
-
PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI в Windows начиная с версии 3.7.
Похожа на
PyErr_SetFromWindowsErr(), но дополнительно, если filename не равенNULL, он декодируется с использованием кодировки файловой системы (os.fsdecode()) и передаётся конструкторуOSErrorв качестве третьего параметра для задания атрибутаfilenameэкземпляра исключения.Доступность: Windows.
-
PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI в Windows начиная с версии 3.7.
Похожа на
PyErr_SetExcFromWindowsErr(), но дополнительно, если filename не равенNULL, он передаётся конструкторуOSErrorв качестве третьего параметра для задания атрибутаfilenameэкземпляра исключения.Доступность: Windows.
-
PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI в Windows начиная с версии 3.7.
Похожа на
PyErr_SetExcFromWindowsErrWithFilenameObject(), но принимает второй объект имени файла.Доступность: Windows.
Добавлено в версии 3.4.
-
PyObject *PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI в Windows начиная с версии 3.7.
Похожа на
PyErr_SetFromWindowsErrWithFilename(), но принимает дополнительный параметр, задающий тип вызываемого исключения.Доступность: Windows.
-
PyObject *PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI начиная с версии 3.7.
Это вспомогательная функция для вызова
ImportError. Значение msg будет использовано как строка сообщения исключения. Значения name и path, которые могут быть равныNULL, будут присвоены соответственно атрибутамnameиpathисключенияImportError.Добавлено в версии 3.3.
-
PyObject *PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path) -
Возвращаемое значение: всегда NULL.Часть стабильного ABI начиная с версии 3.6.
Подобно
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) -
Часть стабильного ABI начиная с версии 3.7.
Подобна
PyErr_SyntaxLocationObject(), но filename — это байтовая строка, декодированная с использованием кодировки файловой системы и обработчика ошибок.Добавлено в версии 3.2.
-
void PyErr_SyntaxLocation(const char *filename, int lineno) -
Часть стабильного ABI.
Подобна
PyErr_SyntaxLocationEx(), но параметр col_offset опущен.
-
void PyErr_BadInternalCall() -
Часть стабильного ABI.
Это сокращённая форма записи для
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) -
Часть стабильного ABI.
Выдаёт предупреждение. Аргумент 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 для управления предупреждениями отсутствует.
-
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) -
Часть стабильного ABI.
Аналогична
PyErr_WarnExplicitObject(), за исключением того, что message и module — это строки в кодировке UTF-8, а filename декодируется с использованием кодировки файловой системы и обработчика ошибок.
-
int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...) -
Часть стабильного ABI.
Функция, аналогичная
PyErr_WarnEx(), но для форматирования сообщения предупреждения используетPyUnicode_FromFormat(). format — это строка в кодировке ASCII.Добавлено в версии 3.2.
-
int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...) -
Часть стабильного ABI начиная с версии 3.6.
Функция, аналогичная
PyErr_WarnFormat(), но category равенResourceWarning, а аргумент source передаётся вwarnings.WarningMessage.Добавлено в версии 3.6.
Проверка индикатора ошибки
-
PyObject *PyErr_Occurred() -
Возвращаемое значение: заимствованная ссылка. Часть стабильного ABI.
Проверяет, установлен ли индикатор ошибки. Если он установлен, возвращает тип исключения (первый аргумент последнего вызова одной из функций
PyErr_Set*илиPyErr_Restore()). Если он не установлен, возвращаетNULL. Возвращаемое значение не принадлежит вам, поэтому вызывать для негоPy_DECREF()не нужно.Вызывающий код должен удерживать GIL.
Примечание
Не сравнивайте возвращаемое значение с конкретным исключением; вместо этого используйте приведённую ниже функцию
PyErr_ExceptionMatches(). (Сравнение может легко завершиться неудачей, поскольку исключение может быть экземпляром, а не классом, если речь идёт об исключении-классе, или может быть подклассом ожидаемого исключения.)
-
int PyErr_ExceptionMatches(PyObject *exc) -
Часть стабильного ABI.
Эквивалентна
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc). Эту функцию следует вызывать только при фактически установленном исключении; если исключение не было возбуждено, произойдёт нарушение доступа к памяти.
-
int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc) -
Часть стабильного ABI.
Возвращает true, если переданное исключение соответствует типу исключения в exc. Если exc — объект-класс, функция также возвращает true, когда given является экземпляром подкласса. Если exc — кортеж, выполняется поиск совпадения среди всех типов исключений в кортеже (и рекурсивно во вложенных кортежах).
-
void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback) -
Часть стабильного ABI.
Получает индикатор ошибки в три переменные, адреса которых передаются функции. Если индикатор ошибки не установлен, все три переменные устанавливаются в
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) -
Часть стабильного ABI.
Устанавливает индикатор ошибки на основе трёх объектов. Если индикатор ошибки уже установлен, сначала он очищается. Если объекты равны
NULL, индикатор ошибки очищается. Не передавайте типNULLи значение или объект трассировки, отличные отNULL. Тип исключения должен быть классом. Не передавайте недопустимый тип или значение исключения. (Нарушение этих правил позднее приведёт к трудноуловимым проблемам.) Этот вызов забирает ссылку на каждый объект: до вызова у вас должна быть ссылка на каждый объект, а после вызова эти ссылки вам больше не принадлежат. (Если вы не понимаете, что это значит, не используйте эту функцию. Я вас предупредил.)Примечание
Эта функция обычно используется только кодом, которому нужно временно сохранить и восстановить индикатор ошибки. Для сохранения текущего индикатора ошибки используйте
PyErr_Fetch().
-
void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) -
Часть стабильного ABI.
При определённых обстоятельствах значения, возвращаемые приведённой ниже функцией
PyErr_Fetch(), могут быть «ненормализованными»: это означает, что*excявляется объектом-классом, но*valне является экземпляром того же класса. В таком случае эту функцию можно использовать для создания экземпляра класса. Если значения уже нормализованы, ничего не происходит. Отложенная нормализация реализована для повышения производительности.Примечание
Эта функция не устанавливает неявно атрибут
__traceback__у значения исключения. Если необходимо правильно установить трассировку, требуется следующий дополнительный фрагмент:if (tb != NULL) { PyException_SetTraceback(val, tb); }
-
PyObject *PyErr_GetHandledException(void) -
Часть стабильного ABI начиная с версии 3.11.
Получает активный экземпляр исключения, который возвращала бы функция
sys.exception(). Это исключение, которое уже было перехвачено, а не только что возбужденное исключение. Возвращает новую ссылку на исключение илиNULL. Не изменяет состояние исключений интерпретатора.Примечание
Эта функция обычно не используется кодом, которому нужно обрабатывать исключения. Вместо этого её можно использовать, когда коду нужно временно сохранить и восстановить состояние исключений. Для восстановления или очистки состояния исключений используйте
PyErr_SetHandledException().Добавлено в версии 3.11.
-
void PyErr_SetHandledException(PyObject *exc) -
Часть стабильного ABI начиная с версии 3.11.
Устанавливает активное исключение, известное из
sys.exception(). Это исключение, которое уже было перехвачено, а не только что возбужденное исключение. Чтобы очистить состояние исключений, передайтеNULL.Примечание
Эта функция обычно не используется кодом, которому нужно обрабатывать исключения. Вместо этого её можно использовать, когда коду нужно временно сохранить и восстановить состояние исключений. Для получения состояния исключений используйте
PyErr_GetHandledException().Добавлено в версии 3.11.
-
void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback) -
Часть стабильного ABI начиная с версии 3.7.
Получает представление сведений об исключении в старом формате, известное из
sys.exc_info(). Это исключение, которое уже было перехвачено, а не только что возбужденное исключение. Возвращает новые ссылки на три объекта; каждый из них может быть равенNULL. Не изменяет состояние сведений об исключении. Эта функция сохранена для обратной совместимости. Предпочтительно использоватьPyErr_GetHandledException().Примечание
Эта функция обычно не используется кодом, которому нужно обрабатывать исключения. Вместо этого её можно использовать, когда коду нужно временно сохранить и восстановить состояние исключений. Для восстановления или очистки состояния исключений используйте
PyErr_SetExcInfo().Добавлено в версии 3.3.
-
void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback) -
Часть стабильного ABI начиная с версии 3.7.
Устанавливает сведения об исключении, известные из
sys.exc_info(). Это исключение, которое уже было перехвачено, а не только что возбужденное исключение. Эта функция забирает ссылки на аргументы. Чтобы очистить состояние исключений, передайтеNULLво всех трёх аргументах. Эта функция сохранена для обратной совместимости. Предпочтительно использоватьPyErr_SetHandledException().Примечание
Эта функция обычно не используется кодом, которому нужно обрабатывать исключения. Вместо этого её можно использовать, когда коду нужно временно сохранить и восстановить состояние исключений. Для чтения состояния исключений используйте
PyErr_GetExcInfo().Добавлено в версии 3.3.
Изменено в версии 3.11: Аргументы
typeиtracebackбольше не используются и могут быть равны NULL. Теперь интерпретатор получает их из экземпляра исключения (аргументаvalue). Функция по-прежнему забирает ссылки на все три аргумента.
Обработка сигналов
-
int PyErr_CheckSignals() -
Часть стабильного ABI.
Эта функция взаимодействует с обработкой сигналов в Python.
Если функция вызвана из главного потока и в главном интерпретаторе Python, она проверяет, поступали ли процессу сигналы, и, если да, вызывает соответствующий обработчик сигналов. Если поддерживается модуль
signal, это может привести к вызову обработчика сигналов, написанного на Python.Функция пытается обработать все ожидающие сигналы, а затем возвращает
0. Однако если обработчик сигналов Python возбуждает исключение, устанавливается индикатор ошибки, и функция немедленно возвращает-1(поэтому другие ожидающие сигналы могут остаться необработанными до следующего вызоваPyErr_CheckSignals()).Если функция вызвана из вторичного потока или во вторичном интерпретаторе Python, она ничего не делает и возвращает
0.Эту функцию может вызывать долго работающий код на C, который должен прерываться по запросу пользователя (например, при нажатии Ctrl-C).
Примечание
Обработчик сигналов Python по умолчанию для
SIGINTвозбуждает исключениеKeyboardInterrupt.
-
void PyErr_SetInterrupt() -
Часть стабильного ABI.
Имитирует поступление сигнала
SIGINT. ЭквивалентнаPyErr_SetInterruptEx(SIGINT).Примечание
Эта функция безопасна для вызова из асинхронного обработчика сигнала. Её можно вызывать без GIL и из обработчика сигналов C.
-
int PyErr_SetInterruptEx(int signum) -
Часть стабильного ABI начиная с версии 3.10.
Имитирует поступление сигнала. При следующем вызове
PyErr_CheckSignals()будет вызван обработчик сигналов Python для указанного номера сигнала.Эту функцию может вызывать код на C, который настраивает собственную обработку сигналов и хочет, чтобы обработчики сигналов Python вызывались ожидаемым образом при запросе прерывания (например, когда пользователь нажимает Ctrl-C, чтобы прервать операцию).
Если Python не обрабатывает указанный сигнал (для него задано значение
signal.SIG_DFLилиsignal.SIG_IGN), он игнорируется.Если signum выходит за пределы допустимого диапазона номеров сигналов, возвращается
-1. В противном случае возвращается0. Эта функция никогда не изменяет индикатор ошибки.Примечание
Эта функция безопасна для вызова из асинхронного обработчика сигнала. Её можно вызывать без GIL и из обработчика сигналов C.
Добавлено в версии 3.10.
-
int PySignal_SetWakeupFd(int fd) -
Эта вспомогательная функция задаёт файловый дескриптор, в который при получении сигнала записывается его номер одним байтом. fd должен быть неблокирующим. Функция возвращает предыдущий файловый дескриптор.
Значение
-1отключает эту возможность; это начальное состояние. В Python функция эквивалентнаsignal.set_wakeup_fd(), но не выполняет проверок ошибок. fd должен быть допустимым файловым дескриптором. Функцию следует вызывать только из главного потока.Изменено в версии 3.5: В Windows функция теперь также поддерживает дескрипторы сокетов.
Классы исключений
-
PyObject *PyErr_NewException(const char *name, PyObject *base, PyObject *dict) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Эта вспомогательная функция создаёт и возвращает новый класс исключения. Аргумент 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) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Аналогична
PyErr_NewException(), но новый класс исключения можно легко снабдить строкой документации: если doc не равенNULL, он будет использован как строка документации класса исключения.Добавлено в версии 3.2.
Объекты исключений
-
PyObject *PyException_GetTraceback(PyObject *ex) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает трассировку, связанную с исключением, в виде новой ссылки. В Python она доступна через атрибут
__traceback__. Если с исключением не связана трассировка, возвращаетNULL.
-
int PyException_SetTraceback(PyObject *ex, PyObject *tb) -
Часть стабильного ABI.
Устанавливает для исключения трассировку tb. Чтобы очистить её, используйте
Py_None.
-
PyObject *PyException_GetContext(PyObject *ex) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает контекст, связанный с исключением (другой экземпляр исключения, во время обработки которого было возбуждено ex), в виде новой ссылки. В Python он доступен через атрибут
__context__. Если с исключением не связан контекст, возвращаетNULL.
-
void PyException_SetContext(PyObject *ex, PyObject *ctx) -
Часть стабильного ABI.
Устанавливает для исключения контекст ctx. Чтобы очистить его, используйте
NULL. Проверка типа, подтверждающая, что ctx является экземпляром исключения, не выполняется. Функция забирает ссылку на ctx.
-
PyObject *PyException_GetCause(PyObject *ex) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает причину, связанную с исключением (экземпляр исключения или
None, заданное с помощьюraise ... from ...), в виде новой ссылки. В Python она доступна через атрибут__cause__.
-
void PyException_SetCause(PyObject *ex, PyObject *cause) -
Часть стабильного ABI.
Устанавливает для исключения причину 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) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект
UnicodeDecodeErrorс атрибутами encoding, object, length, start, end и reason. Значения encoding и reason — строки в кодировке UTF-8.
-
PyObject *PyUnicodeDecodeError_GetEncoding(PyObject *exc) -
PyObject *PyUnicodeEncodeError_GetEncoding(PyObject *exc) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает атрибут encoding указанного объекта исключения.
-
PyObject *PyUnicodeDecodeError_GetObject(PyObject *exc) -
PyObject *PyUnicodeEncodeError_GetObject(PyObject *exc) -
PyObject *PyUnicodeTranslateError_GetObject(PyObject *exc) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает атрибут 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) -
Часть стабильного ABI.
Получает атрибут 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) -
Часть стабильного ABI.
Устанавливает атрибут 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) -
Часть стабильного ABI.
Получает атрибут 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) -
Часть стабильного ABI.
Устанавливает атрибут end указанного объекта исключения в значение end. В случае успеха возвращает
0, в случае ошибки —-1.
-
PyObject *PyUnicodeDecodeError_GetReason(PyObject *exc) -
PyObject *PyUnicodeEncodeError_GetReason(PyObject *exc) -
PyObject *PyUnicodeTranslateError_GetReason(PyObject *exc) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает атрибут 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) -
Часть стабильного ABI.
Устанавливает атрибут reason указанного объекта исключения в значение reason. В случае успеха возвращает
0, в случае ошибки —-1.
Управление рекурсией
Эти две функции позволяют безопасно выполнять рекурсивные вызовы на уровне C как в ядре, так и в модулях расширения. Они необходимы, если рекурсивный код не обязательно вызывает код Python (который автоматически отслеживает глубину рекурсии). Они также не нужны для реализаций tp_call, поскольку протокол вызова обрабатывает рекурсию.
-
int Py_EnterRecursiveCall(const char *where) -
Входит в стабильный ABI с версии 3.9.
Отмечает место, в котором должен быть выполнен рекурсивный вызов на уровне C.
Если определён
USE_STACKCHECK, эта функция проверяет переполнение стека ОС с помощьюPyOS_CheckStack(). В этом случае она устанавливает исключениеMemoryErrorи возвращает ненулевое значение.Затем функция проверяет, достигнут ли предел рекурсии. Если это так, устанавливается исключение
RecursionErrorи возвращается ненулевое значение. В противном случае возвращается ноль.where должна быть строкой в кодировке UTF-8, например
" in instance check", которая будет добавлена к сообщениюRecursionError, вызванному достижением предела глубины рекурсии.Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.
-
void Py_LeaveRecursiveCall(void) -
Входит в стабильный ABI с версии 3.9.
Завершает вызов
Py_EnterRecursiveCall(). Функцию необходимо вызывать один раз для каждого успешного вызоваPy_EnterRecursiveCall().Изменено в версии 3.9: Эта функция теперь также доступна в ограниченном API.
Для правильной реализации tp_repr для контейнерных типов требуется особая обработка рекурсии. Помимо защиты стека, tp_repr должна также отслеживать объекты, чтобы предотвращать циклы. Следующие две функции обеспечивают эту возможность. По сути, это эквиваленты на C функции reprlib.recursive_repr().
-
int Py_ReprEnter(PyObject *object) -
Входит в стабильный ABI.
Вызывается в начале реализации
tp_reprдля обнаружения циклов.Если объект уже был обработан, функция возвращает положительное целое число. В этом случае реализация
tp_reprдолжна вернуть строковый объект, указывающий на цикл. Например, объектыdictвозвращают{...}, а объектыlist—[...].Если достигнут предел рекурсии, функция возвращает отрицательное целое число. В этом случае реализация
tp_reprобычно должна вернутьNULL.В противном случае функция возвращает ноль, и реализация
tp_reprможет продолжить работу в обычном режиме.
-
void Py_ReprLeave(PyObject *object) -
Входит в стабильный ABI.
Завершает вызов
Py_ReprEnter(). Функцию необходимо вызывать один раз для каждого вызоваPy_ReprEnter(), вернувшего ноль.
Стандартные исключения
Все стандартные исключения 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: Раньше эти псевдонимы обозначали отдельные типы исключений.
Примечания:
Стандартные категории предупреждений
Все стандартные категории предупреждений Python доступны в виде глобальных переменных, имена которых состоят из PyExc_ и имени исключения Python. Их тип — PyObject*; все они являются объектами-классами. Для полноты приводим все переменные:
Имя в C | Имя в Python | Примечания |
|---|---|---|
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
Добавлено в версии 3.2: PyExc_ResourceWarning.
Примечания:
Это базовый класс для других стандартных категорий предупреждений.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/c-api/exceptions.html