1#ifndef Py_ERRORS_H 2#define Py_ERRORS_H 3#ifdef __cplusplus 4extern "C" { 5#endif 6 7/* Error objects */ 8 9typedef struct { 10 PyObject_HEAD 11 PyObject *dict; 12 PyObject *args; 13 PyObject *message; 14} PyBaseExceptionObject; 15 16typedef struct { 17 PyObject_HEAD 18 PyObject *dict; 19 PyObject *args; 20 PyObject *message; 21 PyObject *msg; 22 PyObject *filename; 23 PyObject *lineno; 24 PyObject *offset; 25 PyObject *text; 26 PyObject *print_file_and_line; 27} PySyntaxErrorObject; 28 29#ifdef Py_USING_UNICODE 30typedef struct { 31 PyObject_HEAD 32 PyObject *dict; 33 PyObject *args; 34 PyObject *message; 35 PyObject *encoding; 36 PyObject *object; 37 Py_ssize_t start; 38 Py_ssize_t end; 39 PyObject *reason; 40} PyUnicodeErrorObject; 41#endif 42 43typedef struct { 44 PyObject_HEAD 45 PyObject *dict; 46 PyObject *args; 47 PyObject *message; 48 PyObject *code; 49} PySystemExitObject; 50 51typedef struct { 52 PyObject_HEAD 53 PyObject *dict; 54 PyObject *args; 55 PyObject *message; 56 PyObject *myerrno; 57 PyObject *strerror; 58 PyObject *filename; 59} PyEnvironmentErrorObject; 60 61#ifdef MS_WINDOWS 62typedef struct { 63 PyObject_HEAD 64 PyObject *dict; 65 PyObject *args; 66 PyObject *message; 67 PyObject *myerrno; 68 PyObject *strerror; 69 PyObject *filename; 70 PyObject *winerror; 71} PyWindowsErrorObject; 72#endif 73 74/* Error handling definitions */ 75 76PyAPI_FUNC(void) PyErr_SetNone(PyObject *); 77PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); 78PyAPI_FUNC(void) PyErr_SetString(PyObject *, const char *); 79PyAPI_FUNC(PyObject *) PyErr_Occurred(void); 80PyAPI_FUNC(void) PyErr_Clear(void); 81PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); 82PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); 83 84#ifdef Py_DEBUG 85#define _PyErr_OCCURRED() PyErr_Occurred() 86#else 87#define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) 88#endif 89 90/* Error testing and normalization */ 91PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); 92PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); 93PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); 94 95/* */ 96 97#define PyExceptionClass_Check(x) \ 98 (PyClass_Check((x)) || (PyType_Check((x)) && \ 99 PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))) 100 101#define PyExceptionInstance_Check(x) \ 102 (PyInstance_Check((x)) || \ 103 PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)) 104 105#define PyExceptionClass_Name(x) \ 106 (PyClass_Check((x)) \ 107 ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ 108 : (char *)(((PyTypeObject*)(x))->tp_name)) 109 110#define PyExceptionInstance_Class(x) \ 111 ((PyInstance_Check((x)) \ 112 ? (PyObject*)((PyInstanceObject*)(x))->in_class \ 113 : (PyObject*)((x)->ob_type))) 114 115 116/* Predefined exceptions */ 117 118PyAPI_DATA(PyObject *) PyExc_BaseException; 119PyAPI_DATA(PyObject *) PyExc_Exception; 120PyAPI_DATA(PyObject *) PyExc_StopIteration; 121PyAPI_DATA(PyObject *) PyExc_GeneratorExit; 122PyAPI_DATA(PyObject *) PyExc_StandardError; 123PyAPI_DATA(PyObject *) PyExc_ArithmeticError; 124PyAPI_DATA(PyObject *) PyExc_LookupError; 125 126PyAPI_DATA(PyObject *) PyExc_AssertionError; 127PyAPI_DATA(PyObject *) PyExc_AttributeError; 128PyAPI_DATA(PyObject *) PyExc_EOFError; 129PyAPI_DATA(PyObject *) PyExc_FloatingPointError; 130PyAPI_DATA(PyObject *) PyExc_EnvironmentError; 131PyAPI_DATA(PyObject *) PyExc_IOError; 132PyAPI_DATA(PyObject *) PyExc_OSError; 133PyAPI_DATA(PyObject *) PyExc_ImportError; 134PyAPI_DATA(PyObject *) PyExc_IndexError; 135PyAPI_DATA(PyObject *) PyExc_KeyError; 136PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; 137PyAPI_DATA(PyObject *) PyExc_MemoryError; 138PyAPI_DATA(PyObject *) PyExc_NameError; 139PyAPI_DATA(PyObject *) PyExc_OverflowError; 140PyAPI_DATA(PyObject *) PyExc_RuntimeError; 141PyAPI_DATA(PyObject *) PyExc_NotImplementedError; 142PyAPI_DATA(PyObject *) PyExc_SyntaxError; 143PyAPI_DATA(PyObject *) PyExc_IndentationError; 144PyAPI_DATA(PyObject *) PyExc_TabError; 145PyAPI_DATA(PyObject *) PyExc_ReferenceError; 146PyAPI_DATA(PyObject *) PyExc_SystemError; 147PyAPI_DATA(PyObject *) PyExc_SystemExit; 148PyAPI_DATA(PyObject *) PyExc_TypeError; 149PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; 150PyAPI_DATA(PyObject *) PyExc_UnicodeError; 151PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; 152PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; 153PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; 154PyAPI_DATA(PyObject *) PyExc_ValueError; 155PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; 156#ifdef MS_WINDOWS 157PyAPI_DATA(PyObject *) PyExc_WindowsError; 158#endif 159#ifdef __VMS 160PyAPI_DATA(PyObject *) PyExc_VMSError; 161#endif 162 163PyAPI_DATA(PyObject *) PyExc_BufferError; 164 165PyAPI_DATA(PyObject *) PyExc_MemoryErrorInst; 166PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst; 167 168/* Predefined warning categories */ 169PyAPI_DATA(PyObject *) PyExc_Warning; 170PyAPI_DATA(PyObject *) PyExc_UserWarning; 171PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; 172PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; 173PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; 174PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; 175PyAPI_DATA(PyObject *) PyExc_FutureWarning; 176PyAPI_DATA(PyObject *) PyExc_ImportWarning; 177PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; 178PyAPI_DATA(PyObject *) PyExc_BytesWarning; 179 180 181/* Convenience functions */ 182 183PyAPI_FUNC(int) PyErr_BadArgument(void); 184PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); 185PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); 186PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( 187 PyObject *, PyObject *); 188PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( 189 PyObject *, const char *); 190#ifdef MS_WINDOWS 191PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( 192 PyObject *, const Py_UNICODE *); 193#endif /* MS_WINDOWS */ 194 195PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...) 196 Py_GCC_ATTRIBUTE((format(printf, 2, 3))); 197 198#ifdef MS_WINDOWS 199PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject( 200 int, const char *); 201PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( 202 int, const char *); 203PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( 204 int, const Py_UNICODE *); 205PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); 206PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( 207 PyObject *,int, PyObject *); 208PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( 209 PyObject *,int, const char *); 210PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( 211 PyObject *,int, const Py_UNICODE *); 212PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); 213#endif /* MS_WINDOWS */ 214 215/* Export the old function so that the existing API remains available: */ 216PyAPI_FUNC(void) PyErr_BadInternalCall(void); 217PyAPI_FUNC(void) _PyErr_BadInternalCall(char *filename, int lineno); 218/* Mask the old API with a call to the new API for code compiled under 219 Python 2.0: */ 220#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) 221 222/* Function to create a new exception */ 223PyAPI_FUNC(PyObject *) PyErr_NewException( 224 char *name, PyObject *base, PyObject *dict); 225PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( 226 char *name, char *doc, PyObject *base, PyObject *dict); 227PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); 228 229/* In sigcheck.c or signalmodule.c */ 230PyAPI_FUNC(int) PyErr_CheckSignals(void); 231PyAPI_FUNC(void) PyErr_SetInterrupt(void); 232 233/* In signalmodule.c */ 234int PySignal_SetWakeupFd(int fd); 235 236/* Support for adding program text to SyntaxErrors */ 237PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int); 238PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int); 239 240#ifdef Py_USING_UNICODE 241/* The following functions are used to create and modify unicode 242 exceptions from C */ 243 244/* create a UnicodeDecodeError object */ 245PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( 246 const char *, const char *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); 247 248/* create a UnicodeEncodeError object */ 249PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( 250 const char *, const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); 251 252/* create a UnicodeTranslateError object */ 253PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( 254 const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); 255 256/* get the encoding attribute */ 257PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); 258PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); 259 260/* get the object attribute */ 261PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); 262PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); 263PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); 264 265/* get the value of the start attribute (the int * may not be NULL) 266 return 0 on success, -1 on failure */ 267PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); 268PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); 269PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); 270 271/* assign a new value to the start attribute 272 return 0 on success, -1 on failure */ 273PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); 274PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); 275PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); 276 277/* get the value of the end attribute (the int *may not be NULL) 278 return 0 on success, -1 on failure */ 279PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); 280PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); 281PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); 282 283/* assign a new value to the end attribute 284 return 0 on success, -1 on failure */ 285PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); 286PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); 287PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); 288 289/* get the value of the reason attribute */ 290PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); 291PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); 292PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); 293 294/* assign a new value to the reason attribute 295 return 0 on success, -1 on failure */ 296PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( 297 PyObject *, const char *); 298PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( 299 PyObject *, const char *); 300PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( 301 PyObject *, const char *); 302#endif 303 304 305/* These APIs aren't really part of the error implementation, but 306 often needed to format error messages; the native C lib APIs are 307 not available on all platforms, which is why we provide emulations 308 for those platforms in Python/mysnprintf.c, 309 WARNING: The return value of snprintf varies across platforms; do 310 not rely on any particular behavior; eventually the C99 defn may 311 be reliable. 312*/ 313#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) 314# define HAVE_SNPRINTF 315# define snprintf _snprintf 316# define vsnprintf _vsnprintf 317#endif 318 319#include <stdarg.h> 320PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) 321 Py_GCC_ATTRIBUTE((format(printf, 3, 4))); 322PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) 323 Py_GCC_ATTRIBUTE((format(printf, 3, 0))); 324 325#ifdef __cplusplus 326} 327#endif 328#endif /* !Py_ERRORS_H */ 329