異常處理?
本章描述的函數(shù)將讓你處理和觸發(fā) Python 異常。了解一些 Python 異常處理的基本知識(shí)是很重要的。 它的工作原理有點(diǎn)像 POSIX 的 errno 變量:(每個(gè)線程)有一個(gè)全局指示器顯示最近發(fā)生的錯(cuò)誤。 大多數(shù) C API 函數(shù)不會(huì)在成功時(shí)理會(huì)它,但會(huì)在失敗時(shí)設(shè)置它來指示錯(cuò)誤的原因。 多數(shù) C API 函數(shù)也返回一個(gè)錯(cuò)誤指示器,如果它們應(yīng)該返回一個(gè)指針,通常返回 NULL,如果返回一個(gè)整數(shù),則返回 -1 (例外: PyArg_*() 函數(shù)成功時(shí)返回 1 而失敗時(shí)返回 0)。
具體地說,錯(cuò)誤指示器由三個(gè)對(duì)象指針組成:異常的類型,異常的值,和回溯對(duì)象。如果沒有錯(cuò)誤被設(shè)置,這些指針都可以是 NULL``(盡管一些組合使禁止的,例如,如果異常類型是 ``NULL,你不能有一個(gè)非 NULL 的回溯)。
當(dāng)一個(gè)函數(shù)由于它調(diào)用的某個(gè)函數(shù)失敗而必須失敗時(shí),通常不會(huì)設(shè)置錯(cuò)誤指示器;它調(diào)用的那個(gè)函數(shù)已經(jīng)設(shè)置了它。而它負(fù)責(zé)處理錯(cuò)誤和清理異常,或在清除其擁有的所有資源后返回(如對(duì)象應(yīng)用或內(nèi)存分配)。如果不準(zhǔn)備處理異常,則*不*應(yīng)該正常地繼續(xù)。如果是由于一個(gè)錯(cuò)誤返回,那么一定要向調(diào)用者表明已經(jīng)設(shè)置了錯(cuò)誤。如果錯(cuò)誤沒有得到處理或小心傳播,對(duì) Python/C API的其它調(diào)用可能不會(huì)有預(yù)期的行為,并且可能會(huì)以某種神秘的方式失敗。
注解
錯(cuò)誤指示器 不是 sys.exc_info() 的執(zhí)行結(jié)果。前者對(duì)應(yīng)尚未捕獲的異常(異常還在傳播),而后者在捕獲異常后返回這個(gè)異常(異常已經(jīng)停止傳播)。
打印和清理?
-
void
PyErr_Clear()? 清楚錯(cuò)誤指示器。如果沒有設(shè)置錯(cuò)誤指示器,則不會(huì)有作用。
-
void
PyErr_PrintEx(int?set_sys_last_vars)? 將標(biāo)準(zhǔn)回溯打印到
sys.stderr并清除錯(cuò)誤指示器。 除非 錯(cuò)誤是SystemExit,這種情況下不會(huì)打印回溯進(jìn)程,且會(huì)退出 Python 進(jìn)程,并顯示SystemExit實(shí)例指定的錯(cuò)誤代碼。只有在錯(cuò)誤指示器被設(shè)置時(shí)才需要調(diào)用這個(gè)函數(shù),否則這會(huì)導(dǎo)致錯(cuò)誤!
如果 set_sys_last_vars 非零,則變量
sys.last_type,sys.last_value和sys.last_traceback將分別設(shè)置為打印異常的類型,值和回溯。
-
void
PyErr_Print()? PyErr_PrintEx(1)的別名。
-
void
PyErr_WriteUnraisable(PyObject?*obj)? 當(dāng)設(shè)置了異常,但解釋器不可能實(shí)際地觸發(fā)異常時(shí),這個(gè)實(shí)用函數(shù)向
sys.stderr打印一個(gè)警告信息。例如,當(dāng)__del__()方法中發(fā)生異常時(shí)使用這個(gè)函數(shù)。該函數(shù)使用單個(gè)參數(shù) obj 進(jìn)行調(diào)用,該參數(shù)標(biāo)識(shí)發(fā)生不可觸發(fā)異常的上下文。如果可能,obj 的報(bào)告將打印在警告消息中。
調(diào)用此函數(shù)時(shí)必須設(shè)置一個(gè)異常。
拋出異常?
這些函數(shù)可幫助你設(shè)置當(dāng)前線程的錯(cuò)誤指示器。為了方便起見,一些函數(shù)將始終返回 NULL 指針,以便用于 return 語(yǔ)句。
-
void
PyErr_SetString(PyObject?*type, const char?*message)? 這是設(shè)置錯(cuò)誤指示器最常用的方法。第一個(gè)參數(shù)指定異常類型;它通常是標(biāo)準(zhǔn)異常之一,e.g.
PyExc_RuntimeError。你不務(wù)要增加它的引用計(jì)數(shù)。第二個(gè)參數(shù)是錯(cuò)誤信息,它解碼自'utf-8'。
-
void
PyErr_SetObject(PyObject?*type, PyObject?*value)? 此函數(shù)類似于
PyErr_SetString(),但是允許你為異常的“值”指定任意一個(gè) Python 對(duì)象。
-
PyObject*
PyErr_Format(PyObject?*exception, const char?*format, ...)? - Return value: Always NULL.
這個(gè)函數(shù)設(shè)置了一個(gè)錯(cuò)誤的指針并且返回了"NULL".“exception”應(yīng)當(dāng)是一個(gè)python中的異常類。The "format" 和隨后的參數(shù)幫助格式化這個(gè)錯(cuò)誤的信息;他們與
PyUnicode_FromFormat()有著相同的含義和值。"format"是一個(gè)ASCII編碼的字符串
-
PyObject*
PyErr_FormatV(PyObject?*exception, const char?*format, va_list?vargs)? - Return value: Always NULL.
和
PyErr_Format()相同,但它接受一個(gè)va_list類型的參數(shù)而不是可變數(shù)量的參數(shù)集。3.5 新版功能.
-
int
PyErr_BadArgument()? 這是
PyErr_SetString(PyExc_TypeError, message)的簡(jiǎn)寫,其中 message 指出使用了非法參數(shù)調(diào)用內(nèi)置操作。它主要用于內(nèi)部使用。
-
PyObject*
PyErr_NoMemory()? - Return value: Always NULL.
這是
PyErr_SetNone(PyExc_MemoryError)的簡(jiǎn)寫;它返回NULL,以便當(dāng)內(nèi)存耗盡時(shí),對(duì)象分配函數(shù)可以寫return PyErr_NoMemory();。
-
PyObject*
PyErr_SetFromErrno(PyObject?*type)? - Return value: Always NULL.
這是個(gè)方便的函數(shù),當(dāng) C 庫(kù)函數(shù)返回錯(cuò)誤并設(shè)置
errno時(shí),這個(gè)函數(shù)會(huì)觸發(fā)異常。它構(gòu)造一個(gè)元組對(duì)象,其第一項(xiàng)是整數(shù)值errno,第二項(xiàng)是相應(yīng)的錯(cuò)誤消息(從strerror()獲取),然后調(diào)用PyErr_SetObject(type, object)。在 Unix 上,當(dāng)errno值是EINTR,即中斷的系統(tǒng)調(diào)用時(shí),這個(gè)函數(shù)會(huì)調(diào)用PyErr_CheckSignals(),如果設(shè)置了錯(cuò)誤指示器,則將其設(shè)置為該值。該函數(shù)永遠(yuǎn)返回NULL,因此當(dāng)系統(tǒng)調(diào)用返回錯(cuò)誤時(shí),圍繞系統(tǒng)調(diào)用的包裝函數(shù)可以寫成return PyErr_SetFromErrno(type);。
-
PyObject*
PyErr_SetFromErrnoWithFilenameObject(PyObject?*type, PyObject?*filenameObject)? - Return value: Always NULL.
類似于
PyErr_SetFromErrno(),附加的行為是如果 filenameObject 不為NULL,它將作為第三個(gè)參數(shù)傳遞給 type 的構(gòu)造函數(shù)。舉個(gè)例子,在OSError異常中,filenameObject 將用來定義異常實(shí)例的filename屬性。
-
PyObject*
PyErr_SetFromErrnoWithFilenameObjects(PyObject?*type, PyObject?*filenameObject, PyObject?*filenameObject2)? - Return value: Always NULL.
類似于
PyErr_SetFromErrnoWithFilenameObject(),但接受第二個(gè)文件名對(duì)象,用于當(dāng)一個(gè)接受兩個(gè)文件名的函數(shù)失敗時(shí)觸發(fā)錯(cuò)誤。3.4 新版功能.
-
PyObject*
PyErr_SetFromErrnoWithFilename(PyObject?*type, const char?*filename)? - Return value: Always NULL.
類似于
PyErr_SetFromErrnoWithFilenameObject(),但文件名以 C 字符串形式給出。 filename 是從文件系統(tǒng)編碼(os.fsdecode())解碼出來的。
-
PyObject*
PyErr_SetFromWindowsErr(int?ierr)? - Return value: Always NULL.
這是觸發(fā)
WindowsError的方便的函數(shù)。如果 lerr 為0,則改用調(diào)用GetLastError()返回的錯(cuò)誤代碼。它調(diào)用 Win32 函數(shù)FormatMessage()來檢索 ierr 或GetLastError()給定的錯(cuò)誤代碼的 Windows 描述,然后構(gòu)造一個(gè)元組對(duì)象,其第一項(xiàng)是 ierr 值,第二項(xiàng)是相應(yīng)的錯(cuò)誤信息(從FormatMessage()獲?。?,然后調(diào)用PyErr_SetObject(PyExc_WindowsError, object)。該函數(shù)永遠(yuǎn)返回NULL。可用性: Windows。
-
PyObject*
PyErr_SetExcFromWindowsErr(PyObject?*type, int?ierr)? - Return value: Always NULL.
類似于
PyErr_SetFromWindowsErr(),額外的參數(shù)指定要觸發(fā)的異常類型。可用性: Windows。
-
PyObject*
PyErr_SetFromWindowsErrWithFilename(int?ierr, const char?*filename)? - Return value: Always NULL.
類似于
PyErr_SetFromWindowsErrWithFilenameObject(),但是 filename 是以 C 字符串形式給出的。 filename 是從文件系統(tǒng)編碼(os.fsdecode())解碼出來的。可用性: Windows。
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject?*type, int?ierr, PyObject?*filename)? - Return value: Always NULL.
類似于
PyErr_SetFromWindowsErrWithFilenameObject(),額外參數(shù)指定要觸發(fā)的異常類型。可用性: Windows。
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject?*type, int?ierr, PyObject?*filename, PyObject?*filename2)? - Return value: Always NULL.
類似于
PyErr_SetExcFromWindowsErrWithFilenameObject(),但是接受第二個(gè) filename 對(duì)象。可用性: Windows。
3.4 新版功能.
-
PyObject*
PyErr_SetExcFromWindowsErrWithFilename(PyObject?*type, int?ierr, const char?*filename)? - Return value: Always NULL.
類似于
PyErr_SetFromWindowsErrWithFilename(),額外參數(shù)指定要觸發(fā)的異常類型。可用性: Windows。
-
PyObject*
PyErr_SetImportError(PyObject?*msg, PyObject?*name, PyObject?*path)? - Return value: Always NULL.
這是觸發(fā)
ImportError的便捷函數(shù)。 msg 將被設(shè)為異常的消息字符串。 name 和 path ,(都可以為NULL),將用來被設(shè)置ImportError對(duì)應(yīng)的屬性name和path。3.3 新版功能.
-
void
PyErr_SyntaxLocationObject(PyObject?*filename, int?lineno, int?col_offset)? 設(shè)置當(dāng)前異常的文件,行和偏移信息。如果當(dāng)前異常不是
SyntaxError,則它設(shè)置額外的屬性,使異常打印子系統(tǒng)認(rèn)為異常是SyntaxError。3.4 新版功能.
-
void
PyErr_SyntaxLocationEx(const char?*filename, int?lineno, int?col_offset)? 與
PyErr_SyntaxLocationObject()類似,只是 filename 是從文件系統(tǒng)編碼(os.fsdecode())解碼出的一個(gè)字節(jié)字符串。3.2 新版功能.
-
void
PyErr_SyntaxLocation(const char?*filename, int?lineno)? 與
PyErr_SyntaxLocationEx()類似,但省略了參數(shù) col_offset。
-
void
PyErr_BadInternalCall()? 這是
PyErr_SetString(PyExc_SystemError, message)的縮寫,其中 message 表示使用了非法參數(shù)調(diào)用內(nèi)部操作(例如,Python/C API 函數(shù))。它主要用于內(nèi)部使用。
警告?
這些函數(shù)可以從 C 代碼中發(fā)出警告。它們仿照了由 Python 模塊 warnings 導(dǎo)出的函數(shù)。它們通常向 sys.stderr 打印一條警告信息;當(dāng)然,用戶也有可能已經(jīng)指定將警告轉(zhuǎn)換為錯(cuò)誤,在這種情況下,它們將觸發(fā)異常。也有可能由于警告機(jī)制出現(xiàn)問題,使得函數(shù)觸發(fā)異常。如果沒有觸發(fā)異常,返回值為 0 ;如果觸發(fā)異常,返回值為 -1。(無法確定是否實(shí)際打印了警告信息,也無法確定異常觸發(fā)的原因。這是故意為之)。如果觸發(fā)了異常,調(diào)用者應(yīng)該進(jìn)行正常的異常處理(例如,Py_DECREF() 持有引用并返回一個(gè)錯(cuò)誤值)。
-
int
PyErr_WarnEx(PyObject?*category, const char?*message, Py_ssize_t?stack_level)? 發(fā)出一個(gè)警告信息。參數(shù) category 是一個(gè)警告類別(見下面)或
NULL; message 是一個(gè) UTF-8 編碼的字符串。 stack_level 是一個(gè)給出棧幀數(shù)量的正數(shù);警告將從該棧幀中當(dāng)前正在執(zhí)行的代碼行發(fā)出。 stack_level 為 1 的是調(diào)用PyErr_WarnEx()的函數(shù),2 是在此之上的函數(shù),以此類推。警告類別必須是
PyExc_Warning的子類,PyExc_Warning是PyExc_Exception的子類;默認(rèn)警告類別是PyExc_RuntimeWarning。標(biāo)準(zhǔn) Python 警告類別作為全局變量可用,所有其名稱見 標(biāo)準(zhǔn)警告類別 。有關(guān)警告控制的信息,參見模塊文檔
warnings和命令行文檔中的-W選項(xiàng)。沒有用于警告控制的 C API。
-
PyObject*
PyErr_SetImportErrorSubclass(PyObject?*exception, PyObject?*msg, PyObject?*name, PyObject?*path)? - Return value: Always NULL.
和
PyErr_SetImportError()很類似,但這個(gè)函數(shù)允許指定一個(gè)ImportError的子類來觸發(fā)。3.6 新版功能.
-
int
PyErr_WarnExplicitObject(PyObject?*category, PyObject?*message, PyObject?*filename, int?lineno, PyObject?*module, PyObject?*registry)? Issue a warning message with explicit control over all warning attributes. This is a straightforward wrapper around the Python function
warnings.warn_explicit(), see there for more information. The module and registry arguments may be set toNULLto get the default effect described there.3.4 新版功能.
-
int
PyErr_WarnExplicit(PyObject?*category, const char?*message, const char?*filename, int?lineno, const char?*module, PyObject?*registry)? Similar to
PyErr_WarnExplicitObject()except that message and module are UTF-8 encoded strings, and filename is decoded from the filesystem encoding (os.fsdecode()).
-
int
PyErr_WarnFormat(PyObject?*category, Py_ssize_t?stack_level, const char?*format, ...)? Function similar to
PyErr_WarnEx(), but usePyUnicode_FromFormat()to format the warning message. format is an ASCII-encoded string.3.2 新版功能.
-
int
PyErr_ResourceWarning(PyObject?*source, Py_ssize_t?stack_level, const char?*format, ...)? Function similar to
PyErr_WarnFormat(), but category isResourceWarningand it passes source towarnings.WarningMessage().3.6 新版功能.
查詢錯(cuò)誤指示器?
-
PyObject*
PyErr_Occurred()? - Return value: Borrowed reference.
Test whether the error indicator is set. If set, return the exception type (the first argument to the last call to one of the
PyErr_Set*()functions or toPyErr_Restore()). If not set, returnNULL. You do not own a reference to the return value, so you do not need toPy_DECREF()it.注解
Do not compare the return value to a specific exception; use
PyErr_ExceptionMatches()instead, shown below. (The comparison could easily fail since the exception may be an instance instead of a class, in the case of a class exception, or it may be a subclass of the expected exception.)
-
int
PyErr_ExceptionMatches(PyObject?*exc)? Equivalent to
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc). This should only be called when an exception is actually set; a memory access violation will occur if no exception has been raised.
-
int
PyErr_GivenExceptionMatches(PyObject?*given, PyObject?*exc)? Return true if the given exception matches the exception type in exc. If exc is a class object, this also returns true when given is an instance of a subclass. If exc is a tuple, all exception types in the tuple (and recursively in subtuples) are searched for a match.
-
void
PyErr_Fetch(PyObject?**ptype, PyObject?**pvalue, PyObject?**ptraceback)? Retrieve the error indicator into three variables whose addresses are passed. If the error indicator is not set, set all three variables to
NULL. If it is set, it will be cleared and you own a reference to each object retrieved. The value and traceback object may beNULLeven when the type object is not.注解
This function is normally only used by code that needs to catch exceptions or by code that needs to save and restore the error indicator temporarily, e.g.:
{ 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)? Set the error indicator from the three objects. If the error indicator is already set, it is cleared first. If the objects are
NULL, the error indicator is cleared. Do not pass aNULLtype and non-NULLvalue or traceback. The exception type should be a class. Do not pass an invalid exception type or value. (Violating these rules will cause subtle problems later.) This call takes away a reference to each object: you must own a reference to each object before the call and after the call you no longer own these references. (If you don't understand this, don't use this function. I warned you.)注解
This function is normally only used by code that needs to save and restore the error indicator temporarily. Use
PyErr_Fetch()to save the current error indicator.
-
void
PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)? Under certain circumstances, the values returned by
PyErr_Fetch()below can be "unnormalized", meaning that*excis a class object but*valis not an instance of the same class. This function can be used to instantiate the class in that case. If the values are already normalized, nothing happens. The delayed normalization is implemented to improve performance.注解
This function does not implicitly set the
__traceback__attribute on the exception value. If setting the traceback appropriately is desired, the following additional snippet is needed:if (tb != NULL) { PyException_SetTraceback(val, tb); }
-
void
PyErr_GetExcInfo(PyObject?**ptype, PyObject?**pvalue, PyObject?**ptraceback)? Retrieve the exception info, as known from
sys.exc_info(). This refers to an exception that was already caught, not to an exception that was freshly raised. Returns new references for the three objects, any of which may beNULL. Does not modify the exception info state.注解
This function is not normally used by code that wants to handle exceptions. Rather, it can be used when code needs to save and restore the exception state temporarily. Use
PyErr_SetExcInfo()to restore or clear the exception state.3.3 新版功能.
-
void
PyErr_SetExcInfo(PyObject?*type, PyObject?*value, PyObject?*traceback)? Set the exception info, as known from
sys.exc_info(). This refers to an exception that was already caught, not to an exception that was freshly raised. This function steals the references of the arguments. To clear the exception state, passNULLfor all three arguments. For general rules about the three arguments, seePyErr_Restore().注解
This function is not normally used by code that wants to handle exceptions. Rather, it can be used when code needs to save and restore the exception state temporarily. Use
PyErr_GetExcInfo()to read the exception state.3.3 新版功能.
信號(hào)處理?
-
int
PyErr_CheckSignals()? This function interacts with Python's signal handling. It checks whether a signal has been sent to the processes and if so, invokes the corresponding signal handler. If the
signalmodule is supported, this can invoke a signal handler written in Python. In all cases, the default effect forSIGINTis to raise theKeyboardInterruptexception. If an exception is raised the error indicator is set and the function returns-1; otherwise the function returns0. The error indicator may or may not be cleared if it was previously set.
-
void
PyErr_SetInterrupt()? Simulate the effect of a
SIGINTsignal arriving. The next timePyErr_CheckSignals()is called, the Python signal handler forSIGINTwill be called.如果 Python 沒有處理
signal.SIGINT(將它設(shè)為signal.SIG_DFL或signal.SIG_IGN),此函數(shù)將不做任何事。
-
int
PySignal_SetWakeupFd(int?fd)? This utility function specifies a file descriptor to which the signal number is written as a single byte whenever a signal is received. fd must be non-blocking. It returns the previous such file descriptor.
The value
-1disables the feature; this is the initial state. This is equivalent tosignal.set_wakeup_fd()in Python, but without any error checking. fd should be a valid file descriptor. The function should only be called from the main thread.在 3.5 版更改: 在 Windows 上,此函數(shù)現(xiàn)在也支持套接字處理。
異常類?
-
PyObject*
PyErr_NewException(const char?*name, PyObject?*base, PyObject?*dict)? - Return value: New reference.
This utility function creates and returns a new exception class. The name argument must be the name of the new exception, a C string of the form
module.classname. The base and dict arguments are normallyNULL. This creates a class object derived fromException(accessible in C asPyExc_Exception).The
__module__attribute of the new class is set to the first part (up to the last dot) of the name argument, and the class name is set to the last part (after the last dot). The base argument can be used to specify alternate base classes; it can either be only one class or a tuple of classes. The dict argument can be used to specify a dictionary of class variables and methods.
-
PyObject*
PyErr_NewExceptionWithDoc(const char?*name, const char?*doc, PyObject?*base, PyObject?*dict)? - Return value: New reference.
和
PyErr_NewException()一樣,除了可以輕松地給新的異常類一個(gè)文檔字符串:如果 doc 屬性非空,它將用作異常類的文檔字符串。3.2 新版功能.
異常對(duì)象?
-
PyObject*
PyException_GetTraceback(PyObject?*ex)? - Return value: New reference.
Return the traceback associated with the exception as a new reference, as accessible from Python through
__traceback__. If there is no traceback associated, this returnsNULL.
-
int
PyException_SetTraceback(PyObject?*ex, PyObject?*tb)? 將異常關(guān)聯(lián)的回溯設(shè)置為 tb 。使用``Py_None``清除它。
-
PyObject*
PyException_GetContext(PyObject?*ex)? - Return value: New reference.
Return the context (another exception instance during whose handling ex was raised) associated with the exception as a new reference, as accessible from Python through
__context__. If there is no context associated, this returnsNULL.
-
void
PyException_SetContext(PyObject?*ex, PyObject?*ctx)? Set the context associated with the exception to ctx. Use
NULLto clear it. There is no type check to make sure that ctx is an exception instance. This steals a reference to ctx.
-
PyObject*
PyException_GetCause(PyObject?*ex)? - Return value: New reference.
Return the cause (either an exception instance, or
None, set byraise ... from ...) associated with the exception as a new reference, as accessible from Python through__cause__.
-
void
PyException_SetCause(PyObject?*ex, PyObject?*cause)? Set the cause associated with the exception to cause. Use
NULLto clear it. There is no type check to make sure that cause is either an exception instance orNone. This steals a reference to cause.__suppress_context__is implicitly set toTrueby this function.
Unicode 異常對(duì)象?
The following functions are used to create and modify Unicode exceptions from 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.
Create a
UnicodeDecodeErrorobject with the attributes encoding, object, length, start, end and reason. encoding and reason are UTF-8 encoded strings.
-
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.
Create a
UnicodeEncodeErrorobject with the attributes encoding, object, length, start, end and reason. encoding and reason are UTF-8 encoded strings.
-
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.
Create a
UnicodeTranslateErrorobject with the attributes object, length, start, end and reason. reason is a UTF-8 encoded string.
-
PyObject*
PyUnicodeDecodeError_GetEncoding(PyObject?*exc)? -
PyObject*
PyUnicodeEncodeError_GetEncoding(PyObject?*exc)? - Return value: New reference.
返回給定異常對(duì)象的 encoding 屬性
-
PyObject*
PyUnicodeDecodeError_GetObject(PyObject?*exc)? -
PyObject*
PyUnicodeEncodeError_GetObject(PyObject?*exc)? -
PyObject*
PyUnicodeTranslateError_GetObject(PyObject?*exc)? - Return value: New reference.
返回給定異常對(duì)象的 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)? Get the start attribute of the given exception object and place it into *start. start must not be
NULL. Return0on success,-1on failure.
-
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)? Set the start attribute of the given exception object to start. Return
0on success,-1on failure.
-
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)? Get the end attribute of the given exception object and place it into *end. end must not be
NULL. Return0on success,-1on failure.
-
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)? Set the end attribute of the given exception object to end. Return
0on success,-1on failure.
-
PyObject*
PyUnicodeDecodeError_GetReason(PyObject?*exc)? -
PyObject*
PyUnicodeEncodeError_GetReason(PyObject?*exc)? -
PyObject*
PyUnicodeTranslateError_GetReason(PyObject?*exc)? - Return value: New reference.
返回給定異常對(duì)象的 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)? Set the reason attribute of the given exception object to reason. Return
0on success,-1on failure.
遞歸控制?
These two functions provide a way to perform safe recursive calls at the C level, both in the core and in extension modules. They are needed if the recursive code does not necessarily invoke Python code (which tracks its recursion depth automatically).
-
int
Py_EnterRecursiveCall(const char?*where)? Marks a point where a recursive C-level call is about to be performed.
如果定義了
USE_STACKCHECK,此函數(shù)會(huì)使用PyOS_CheckStack()來檢查操作系統(tǒng)堆棧是否溢出。 在這種情況下,它將設(shè)置一個(gè)MemoryError并返回非零值。The function then checks if the recursion limit is reached. If this is the case, a
RecursionErroris set and a nonzero value is returned. Otherwise, zero is returned.where should be a string such as
" in instance check"to be concatenated to theRecursionErrormessage caused by the recursion depth limit.
-
void
Py_LeaveRecursiveCall()? Ends a
Py_EnterRecursiveCall(). Must be called once for each successful invocation ofPy_EnterRecursiveCall().
Properly implementing tp_repr for container types requires
special recursion handling. In addition to protecting the stack,
tp_repr also needs to track objects to prevent cycles. The
following two functions facilitate this functionality. Effectively,
these are the C equivalent to reprlib.recursive_repr().
-
int
Py_ReprEnter(PyObject?*object)? Called at the beginning of the
tp_reprimplementation to detect cycles.If the object has already been processed, the function returns a positive integer. In that case the
tp_reprimplementation should return a string object indicating a cycle. As examples,dictobjects return{...}andlistobjects return[...].The function will return a negative integer if the recursion limit is reached. In that case the
tp_reprimplementation should typically returnNULL.Otherwise, the function returns zero and the
tp_reprimplementation can continue normally.
-
void
Py_ReprLeave(PyObject?*object)? Ends a
Py_ReprEnter(). Must be called once for each invocation ofPy_ReprEnter()that returns zero.
標(biāo)準(zhǔn)異常?
All standard Python exceptions are available as global variables whose names are
PyExc_ followed by the Python exception name. These have the type
PyObject*; they are all class objects. For completeness, here are all
the variables:
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 and PyExc_TimeoutError 介紹如下 PEP 3151.
3.5 新版功能: PyExc_StopAsyncIteration 和 PyExc_RecursionError.
3.6 新版功能: PyExc_ModuleNotFoundError.
這些是兼容性別名 PyExc_OSError:
C 名稱 |
注釋 |
|---|---|
|
|
|
|
|
(3) |
在 3.3 版更改: 這些別名曾經(jīng)是單獨(dú)的異常類型。
注釋:
這是其他標(biāo)準(zhǔn)異常的基類。
Only defined on Windows; protect code that uses this by testing that the preprocessor macro
MS_WINDOWSis defined.
標(biāo)準(zhǔn)警告類別?
All standard Python warning categories are available as global variables whose
names are PyExc_ followed by the Python exception name. These have the type
PyObject*; they are all class objects. For completeness, here are all
the variables:
C 名稱 |
Python 名稱 |
注釋 |
|---|---|---|
|
(1) |
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
3.2 新版功能: PyExc_ResourceWarning.
注釋:
這是其他標(biāo)準(zhǔn)警告類別的基類。
