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