The functions described in this chapter will let you handle and raise Pythonexceptions. It is important to understand some of the basics of Pythonexception handling. It works somewhat like the Unixerrno variable:there is a global indicator (per thread) of the last error that occurred. Mostfunctions don’t clear this on success, but will set it to indicate the cause ofthe error on failure. Most functions also return an error indicator, usuallyNULL if they are supposed to return a pointer, or-1 if they return aninteger (exception: thePyArg_*() functions return1 for success and0 for failure).
When a function must fail because some function it called failed, it generallydoesn’t set the error indicator; the function it called already set it. It isresponsible for either handling the error and clearing the exception orreturning after cleaning up any resources it holds (such as object references ormemory allocations); it shouldnot continue normally if it is not prepared tohandle the error. If returning due to an error, it is important to indicate tothe caller that an error has been set. If the error is not handled or carefullypropagated, additional calls into the Python/C API may not behave as intendedand may fail in mysterious ways.
The error indicator consists of three Python objects corresponding to the resultofsys.exc_info(). API functions exist to interact with the error indicatorin various ways. There is a separate error indicator for each thread.
Print a standard traceback tosys.stderr and clear the error indicator.Call this function only when the error indicator is set. (Otherwise it willcause a fatal error!)
Ifset_sys_last_vars is nonzero, the variablessys.last_type,sys.last_value andsys.last_traceback will be set to thetype, value and traceback of the printed exception, respectively.
Alias forPyErr_PrintEx(1).
Test whether the error indicator is set. If set, return the exceptiontype(the first argument to the last call to one of thePyErr_Set*()functions or toPyErr_Restore()). If not set, returnNULL. You do notown a reference to the return value, so you do not need toPy_DECREF()it.
Note
Do not compare the return value to a specific exception; usePyErr_ExceptionMatches() instead, shown below. (The comparison couldeasily fail since the exception may be an instance instead of a class, in thecase of a class exception, or it may the a subclass of the expected exception.)
Equivalent toPyErr_GivenExceptionMatches(PyErr_Occurred(),exc). Thisshould only be called when an exception is actually set; a memory accessviolation will occur if no exception has been raised.
Return true if thegiven exception matches the exception inexc. Ifexc is a class object, this also returns true whengiven is an instanceof a subclass. Ifexc is a tuple, all exceptions in the tuple (andrecursively in subtuples) are searched for a match.
Under certain circumstances, the values returned byPyErr_Fetch() belowcan be “unnormalized”, meaning that*exc is a class object but*val isnot an instance of the same class. This function can be used to instantiatethe class in that case. If the values are already normalized, nothing happens.The delayed normalization is implemented to improve performance.
Clear the error indicator. If the error indicator is not set, there is noeffect.
Retrieve the error indicator into three variables whose addresses are passed.If the error indicator is not set, set all three variables toNULL. If it isset, it will be cleared and you own a reference to each object retrieved. Thevalue and traceback object may beNULL even when the type object is not.
Note
This function is normally only used by code that needs to handle exceptions orby code that needs to save and restore the error indicator temporarily.
Set the error indicator from the three objects. If the error indicator isalready set, it is cleared first. If the objects areNULL, the errorindicator is cleared. Do not pass aNULL type and non-NULL value ortraceback. The exception type should be a class. Do not pass an invalidexception type or value. (Violating these rules will cause subtle problemslater.) This call takes away a reference to each object: you must own areference to each object before the call and after the call you no longer ownthese references. (If you don’t understand this, don’t use this function. Iwarned you.)
Note
This function is normally only used by code that needs to save and restore theerror indicator temporarily; usePyErr_Fetch() to save the currentexception state.
Retrieve the exception info, as known fromsys.exc_info(). This refersto an exception that was already caught, not to an exception that wasfreshly raised. Returns new references for the three objects, any of whichmay beNULL. Does not modify the exception info state.
Note
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 exceptionstate temporarily. UsePyErr_SetExcInfo() to restore or clear theexception state.
New in version 3.3.
Set the exception info, as known fromsys.exc_info(). This refersto an exception that was already caught, not to an exception that wasfreshly raised. This function steals the references of the arguments.To clear the exception state, passNULL for all three arguments.For general rules about the three arguments, seePyErr_Restore().
Note
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 exceptionstate temporarily. UsePyErr_GetExcInfo() to read the exceptionstate.
New in version 3.3.
This is the most common way to set the error indicator. The first argumentspecifies the exception type; it is normally one of the standard exceptions,e.g.PyExc_RuntimeError. You need not increment its reference count.The second argument is an error message; it is decoded from'utf-8‘.
This function is similar toPyErr_SetString() but lets you specify anarbitrary Python object for the “value” of the exception.
This function sets the error indicator and returnsNULL.exceptionshould be a Python exception class. Theformat and subsequentparameters help format the error message; they have the same meaning andvalues as inPyUnicode_FromFormat().format is an ASCII-encodedstring.
This is a shorthand forPyErr_SetString(PyExc_TypeError,message), wheremessage indicates that a built-in operation was invoked with an illegalargument. It is mostly for internal use.
This is a shorthand forPyErr_SetNone(PyExc_MemoryError); it returnsNULLso an object allocation function can writereturnPyErr_NoMemory(); when itruns out of memory.
This is a convenience function to raise an exception when a C library functionhas returned an error and set the C variableerrno. It constructs atuple object whose first item is the integererrno value and whosesecond item is the corresponding error message (gotten fromstrerror()),and then callsPyErr_SetObject(type,object). On Unix, when theerrno value isEINTR, indicating an interrupted system call,this callsPyErr_CheckSignals(), and if that set the error indicator,leaves it set to that. The function always returnsNULL, so a wrapperfunction around a system call can writereturnPyErr_SetFromErrno(type);when the system call returns an error.
Similar toPyErr_SetFromErrno(), with the additional behavior that iffilenameObject is notNULL, it is passed to the constructor oftype asa third parameter. In the case of exceptions such asIOError andOSError, this is used to define thefilename attribute of theexception instance.
Similar toPyErr_SetFromErrnoWithFilenameObject(), but the filenameis given as a C string.filename is decoded from the filesystem encoding(sys.getfilesystemencoding()).
This is a convenience function to raiseWindowsError. If called withierr of0, the error code returned by a call toGetLastError()is used instead. It calls the Win32 functionFormatMessage() to retrievethe Windows description of error code given byierr orGetLastError(),then it constructs a tuple object whose first item is theierr value and whosesecond item is the corresponding error message (gotten fromFormatMessage()), and then callsPyErr_SetObject(PyExc_WindowsError,object). This function always returnsNULL. Availability: Windows.
Similar toPyErr_SetFromWindowsErr(), with an additional parameterspecifying the exception type to be raised. Availability: Windows.
Similar toPyErr_SetFromWindowsErr(), with the additional behaviorthat iffilenameObject is notNULL, it is passed to the constructor ofWindowsError as a third parameter. Availability: Windows.
Similar toPyErr_SetFromWindowsErrWithFilenameObject(), but thefilename is given as a C string.filename is decoded from the filesystemencoding (sys.getfilesystemencoding()). Availability: Windows.
Similar toPyErr_SetFromWindowsErrWithFilenameObject(), with anadditional parameter specifying the exception type to be raised.Availability: Windows.
Similar toPyErr_SetFromWindowsErrWithFilename(), with an additionalparameter specifying the exception type to be raised. Availability: Windows.
This is a convenience function to raiseImportError.msg will beset as the exception’s message string.name andpath, both of which canbeNULL, will be set as theImportError‘s respectivenameandpath attributes.
New in version 3.3.
Set file, line, and offset information for the current exception. If thecurrent exception is not aSyntaxError, then it sets additionalattributes, which make the exception printing subsystem think the exceptionis aSyntaxError.filename is decoded from the filesystem encoding(sys.getfilesystemencoding()).
New in version 3.2.
LikePyErr_SyntaxLocationEx(), but the col_offset parameter isomitted.
This is a shorthand forPyErr_SetString(PyExc_SystemError,message),wheremessage indicates that an internal operation (e.g. a Python/C APIfunction) was invoked with an illegal argument. It is mostly for internaluse.
Issue a warning message. Thecategory argument is a warning category (seebelow) orNULL; themessage argument is an UTF-8 encoded string.stack_level is apositive number giving a number of stack frames; the warning will be issued fromthe currently executing line of code in that stack frame. Astack_level of 1is the function callingPyErr_WarnEx(), 2 is the function above that,and so forth.
This function normally prints a warning message tosys.stderr; however, it isalso possible that the user has specified that warnings are to be turned intoerrors, and in that case this will raise an exception. It is also possible thatthe function raises an exception because of a problem with the warning machinery(the implementation imports thewarnings module to do the heavy lifting).The return value is0 if no exception is raised, or-1 if an exceptionis raised. (It is not possible to determine whether a warning message isactually printed, nor what the reason is for the exception; this isintentional.) If an exception is raised, the caller should do its normalexception handling (for example,Py_DECREF() owned references and returnan error value).
Warning categories must be subclasses ofWarning; the default warningcategory isRuntimeWarning. The standard Python warning categories areavailable as global variables whose names arePyExc_ followed by the Pythonexception name. These have the typePyObject*; they are all classobjects. Their names arePyExc_Warning,PyExc_UserWarning,PyExc_UnicodeWarning,PyExc_DeprecationWarning,PyExc_SyntaxWarning,PyExc_RuntimeWarning, andPyExc_FutureWarning.PyExc_Warning is a subclass ofPyExc_Exception; the other warning categories are subclasses ofPyExc_Warning.
For information about warning control, see the documentation for thewarnings module and the-W option in the command linedocumentation. There is no C API for warning control.
Issue a warning message with explicit control over all warning attributes. Thisis a straightforward wrapper around the Python functionwarnings.warn_explicit(), see there for more information. Themoduleandregistry arguments may be set toNULL to get the default effectdescribed there.message andmodule are UTF-8 encoded strings,filename is decoded from the filesystem encoding(sys.getfilesystemencoding()).
Function similar toPyErr_WarnEx(), but usePyUnicode_FromFormat() to format the warning message.format isan ASCII-encoded string.
New in version 3.2.
This function interacts with Python’s signal handling. It checks whether asignal has been sent to the processes and if so, invokes the correspondingsignal handler. If thesignal module is supported, this can invoke asignal handler written in Python. In all cases, the default effect forSIGINT is to raise theKeyboardInterrupt exception. If anexception is raised the error indicator is set and the function returns-1;otherwise the function returns0. The error indicator may or may not becleared if it was previously set.
This function simulates the effect of aSIGINT signal arriving — thenext timePyErr_CheckSignals() is called,KeyboardInterrupt willbe raised. It may be called without holding the interpreter lock.
This utility function specifies a file descriptor to which a'\0' byte willbe written whenever a signal is received. It returns the previous such filedescriptor. The value-1 disables the feature; this is the initial state.This is equivalent tosignal.set_wakeup_fd() in Python, but without anyerror checking.fd should be a valid file descriptor. The function shouldonly be called from the main thread.
This utility function creates and returns a new exception class. Thenameargument must be the name of the new exception, a C string of the formmodule.classname. Thebase anddict 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 (upto the last dot) of thename argument, and the class name is set to the lastpart (after the last dot). Thebase argument can be used to specify alternatebase classes; it can either be only one class or a tuple of classes. Thedictargument can be used to specify a dictionary of class variables and methods.
Same asPyErr_NewException(), except that the new exception class caneasily be given a docstring: Ifdoc is non-NULL, it will be used as thedocstring for the exception class.
New in version 3.2.
This utility function prints a warning message tosys.stderr when anexception has been set but it is impossible for the interpreter to actuallyraise the exception. It is used, for example, when an exception occurs in an__del__() method.
The function is called with a single argumentobj that identifies the contextin which the unraisable exception occurred. The repr ofobj will be printed inthe warning message.
Return the traceback associated with the exception as a new reference, asaccessible from Python through__traceback__. If there is notraceback associated, this returnsNULL.
Set the traceback associated with the exception totb. UsePy_None toclear it.
Return the context (another exception instance during whose handlingex wasraised) associated with the exception as a new reference, as accessible fromPython through__context__. If there is no context associated, thisreturnsNULL.
Set the context associated with the exception toctx. UseNULL to clearit. There is no type check to make sure thatctx is an exception instance.This steals a reference toctx.
Return the cause (either an exception instance, orNone,set byraise...from...) associated with the exception as a newreference, as accessible from Python through__cause__.
Set the cause associated with the exception tocause. UseNULL to clearit. There is no type check to make sure thatcause is either an exceptioninstance orNone. This steals a reference tocause.
__suppress_context__ is implicitly set toTrue by this function.
The following functions are used to create and modify Unicode exceptions from C.
Create aUnicodeDecodeError object with the attributesencoding,object,length,start,end andreason.encoding andreason areUTF-8 encoded strings.
Create aUnicodeEncodeError object with the attributesencoding,object,length,start,end andreason.encoding andreason areUTF-8 encoded strings.
Create aUnicodeTranslateError object with the attributesobject,length,start,end andreason.reason is an UTF-8 encoded string.
Return theencoding attribute of the given exception object.
Return theobject attribute of the given exception object.
Get thestart attribute of the given exception object and place it into*start.start must not beNULL. Return0 on success,-1 onfailure.
Set thestart attribute of the given exception object tostart. Return0 on success,-1 on failure.
Get theend attribute of the given exception object and place it into*end.end must not beNULL. Return0 on success,-1 onfailure.
Set theend attribute of the given exception object toend. Return0on success,-1 on failure.
Return thereason attribute of the given exception object.
Set thereason attribute of the given exception object toreason. Return0 on success,-1 on failure.
These two functions provide a way to perform safe recursive calls at the Clevel, both in the core and in extension modules. They are needed if therecursive code does not necessarily invoke Python code (which tracks itsrecursion depth automatically).
Marks a point where a recursive C-level call is about to be performed.
IfUSE_STACKCHECK is defined, this function checks if the OSstack overflowed usingPyOS_CheckStack(). In this is the case, itsets aMemoryError and returns a nonzero value.
The function then checks if the recursion limit is reached. If this is thecase, aRuntimeError is set and a nonzero value is returned.Otherwise, zero is returned.
where should be a string such as"ininstancecheck" to beconcatenated to theRuntimeError message caused by the recursion depthlimit.
Ends aPy_EnterRecursiveCall(). Must be called once for eachsuccessful invocation ofPy_EnterRecursiveCall().
Properly implementingtp_repr for container types requiresspecial recursion handling. In addition to protecting the stack,tp_repr also needs to track objects to prevent cycles. Thefollowing two functions facilitate this functionality. Effectively,these are the C equivalent toreprlib.recursive_repr().
Called at the beginning of thetp_repr implementation todetect cycles.
If the object has already been processed, the function returns apositive integer. In that case thetp_repr implementationshould return a string object indicating a cycle. As examples,dict objects return{...} andlist objectsreturn[...].
The function will return a negative integer if the recursion limitis reached. In that case thetp_repr implementation shouldtypically returnNULL.
Otherwise, the function returns zero and thetp_reprimplementation can continue normally.
Ends aPy_ReprEnter(). Must be called once for eachinvocation ofPy_ReprEnter() that returns zero.
All standard Python exceptions are available as global variables whose names arePyExc_ followed by the Python exception name. These have the typePyObject*; they are all class objects. For completeness, here are allthe variables:
| C Name | Python Name | Notes |
|---|---|---|
| PyExc_BaseException | BaseException | (1) |
| PyExc_Exception | Exception | (1) |
| PyExc_ArithmeticError | ArithmeticError | (1) |
| PyExc_LookupError | LookupError | (1) |
| PyExc_AssertionError | AssertionError | |
| PyExc_AttributeError | AttributeError | |
| PyExc_BlockingIOError | BlockingIOError | |
| PyExc_BrokenPipeError | BrokenPipeError | |
| PyExc_ChildProcessError | ChildProcessError | |
| PyExc_ConnectionError | ConnectionError | |
| PyExc_ConnectionAbortedError | ConnectionAbortedError | |
| PyExc_ConnectionRefusedError | ConnectionRefusedError | |
| PyExc_ConnectionResetError | ConnectionResetError | |
| PyExc_FileExistsError | FileExistsError | |
| PyExc_FileNotFoundError | FileNotFoundError | |
| PyExc_EOFError | EOFError | |
| PyExc_FloatingPointError | FloatingPointError | |
| PyExc_ImportError | ImportError | |
| PyExc_IndexError | IndexError | |
| PyExc_InterruptedError | InterruptedError | |
| PyExc_IsADirectoryError | IsADirectoryError | |
| PyExc_KeyError | KeyError | |
| PyExc_KeyboardInterrupt | KeyboardInterrupt | |
| PyExc_MemoryError | MemoryError | |
| PyExc_NameError | NameError | |
| PyExc_NotADirectoryError | NotADirectoryError | |
| PyExc_NotImplementedError | NotImplementedError | |
| PyExc_OSError | OSError | (1) |
| PyExc_OverflowError | OverflowError | |
| PyExc_PermissionError | PermissionError | |
| PyExc_ProcessLookupError | ProcessLookupError | |
| PyExc_ReferenceError | ReferenceError | (2) |
| PyExc_RuntimeError | RuntimeError | |
| PyExc_SyntaxError | SyntaxError | |
| PyExc_SystemError | SystemError | |
| PyExc_TimeoutError | TimeoutError | |
| PyExc_SystemExit | SystemExit | |
| PyExc_TypeError | TypeError | |
| PyExc_ValueError | ValueError | |
| PyExc_ZeroDivisionError | ZeroDivisionError |
New in version 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_ProcessLookupErrorandPyExc_TimeoutError were introduced followingPEP 3151.
These are compatibility aliases toPyExc_OSError:
| C Name | Notes |
|---|---|
| PyExc_EnvironmentError | |
| PyExc_IOError | |
| PyExc_WindowsError | (3) |
Changed in version 3.3:These aliases used to be separate exception types.
Notes:
Enter search terms or a module, class or function name.