xref: /third_party/python/Include/pyerrors.h (revision 7db96d56)
1#ifndef Py_ERRORS_H
2#define Py_ERRORS_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
7#include <stdarg.h>               // va_list
8
9/* Error handling definitions */
10
11PyAPI_FUNC(void) PyErr_SetNone(PyObject *);
12PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *);
13PyAPI_FUNC(void) PyErr_SetString(
14    PyObject *exception,
15    const char *string   /* decoded from utf-8 */
16    );
17PyAPI_FUNC(PyObject *) PyErr_Occurred(void);
18PyAPI_FUNC(void) PyErr_Clear(void);
19PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **);
20PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *);
21#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030b0000
22PyAPI_FUNC(PyObject*) PyErr_GetHandledException(void);
23PyAPI_FUNC(void) PyErr_SetHandledException(PyObject *);
24#endif
25#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
26PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
27PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
28#endif
29
30/* Defined in Python/pylifecycle.c
31
32   The Py_FatalError() function is replaced with a macro which logs
33   automatically the name of the current function, unless the Py_LIMITED_API
34   macro is defined. */
35PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message);
36
37/* Error testing and normalization */
38PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *);
39PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *);
40PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**);
41
42/* Traceback manipulation (PEP 3134) */
43PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *);
44PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *);
45
46/* Cause manipulation (PEP 3134) */
47PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *);
48PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *);
49
50/* Context manipulation (PEP 3134) */
51PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *);
52PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *);
53
54/* */
55
56#define PyExceptionClass_Check(x)                                       \
57    (PyType_Check((x)) &&                                               \
58     PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
59
60#define PyExceptionInstance_Check(x)                    \
61    PyType_FastSubclass(Py_TYPE(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)
62
63PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *);
64
65#define PyExceptionInstance_Class(x) ((PyObject*)Py_TYPE(x))
66
67#define _PyBaseExceptionGroup_Check(x)                   \
68    PyObject_TypeCheck(x, (PyTypeObject *)PyExc_BaseExceptionGroup)
69
70/* Predefined exceptions */
71
72PyAPI_DATA(PyObject *) PyExc_BaseException;
73PyAPI_DATA(PyObject *) PyExc_Exception;
74PyAPI_DATA(PyObject *) PyExc_BaseExceptionGroup;
75#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
76PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration;
77#endif
78PyAPI_DATA(PyObject *) PyExc_StopIteration;
79PyAPI_DATA(PyObject *) PyExc_GeneratorExit;
80PyAPI_DATA(PyObject *) PyExc_ArithmeticError;
81PyAPI_DATA(PyObject *) PyExc_LookupError;
82
83PyAPI_DATA(PyObject *) PyExc_AssertionError;
84PyAPI_DATA(PyObject *) PyExc_AttributeError;
85PyAPI_DATA(PyObject *) PyExc_BufferError;
86PyAPI_DATA(PyObject *) PyExc_EOFError;
87PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
88PyAPI_DATA(PyObject *) PyExc_OSError;
89PyAPI_DATA(PyObject *) PyExc_ImportError;
90#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
91PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError;
92#endif
93PyAPI_DATA(PyObject *) PyExc_IndexError;
94PyAPI_DATA(PyObject *) PyExc_KeyError;
95PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt;
96PyAPI_DATA(PyObject *) PyExc_MemoryError;
97PyAPI_DATA(PyObject *) PyExc_NameError;
98PyAPI_DATA(PyObject *) PyExc_OverflowError;
99PyAPI_DATA(PyObject *) PyExc_RuntimeError;
100#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
101PyAPI_DATA(PyObject *) PyExc_RecursionError;
102#endif
103PyAPI_DATA(PyObject *) PyExc_NotImplementedError;
104PyAPI_DATA(PyObject *) PyExc_SyntaxError;
105PyAPI_DATA(PyObject *) PyExc_IndentationError;
106PyAPI_DATA(PyObject *) PyExc_TabError;
107PyAPI_DATA(PyObject *) PyExc_ReferenceError;
108PyAPI_DATA(PyObject *) PyExc_SystemError;
109PyAPI_DATA(PyObject *) PyExc_SystemExit;
110PyAPI_DATA(PyObject *) PyExc_TypeError;
111PyAPI_DATA(PyObject *) PyExc_UnboundLocalError;
112PyAPI_DATA(PyObject *) PyExc_UnicodeError;
113PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError;
114PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError;
115PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
116PyAPI_DATA(PyObject *) PyExc_ValueError;
117PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
118
119#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
120PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
121PyAPI_DATA(PyObject *) PyExc_BrokenPipeError;
122PyAPI_DATA(PyObject *) PyExc_ChildProcessError;
123PyAPI_DATA(PyObject *) PyExc_ConnectionError;
124PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError;
125PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError;
126PyAPI_DATA(PyObject *) PyExc_ConnectionResetError;
127PyAPI_DATA(PyObject *) PyExc_FileExistsError;
128PyAPI_DATA(PyObject *) PyExc_FileNotFoundError;
129PyAPI_DATA(PyObject *) PyExc_InterruptedError;
130PyAPI_DATA(PyObject *) PyExc_IsADirectoryError;
131PyAPI_DATA(PyObject *) PyExc_NotADirectoryError;
132PyAPI_DATA(PyObject *) PyExc_PermissionError;
133PyAPI_DATA(PyObject *) PyExc_ProcessLookupError;
134PyAPI_DATA(PyObject *) PyExc_TimeoutError;
135#endif
136
137
138/* Compatibility aliases */
139PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
140PyAPI_DATA(PyObject *) PyExc_IOError;
141#ifdef MS_WINDOWS
142PyAPI_DATA(PyObject *) PyExc_WindowsError;
143#endif
144
145/* Predefined warning categories */
146PyAPI_DATA(PyObject *) PyExc_Warning;
147PyAPI_DATA(PyObject *) PyExc_UserWarning;
148PyAPI_DATA(PyObject *) PyExc_DeprecationWarning;
149PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning;
150PyAPI_DATA(PyObject *) PyExc_SyntaxWarning;
151PyAPI_DATA(PyObject *) PyExc_RuntimeWarning;
152PyAPI_DATA(PyObject *) PyExc_FutureWarning;
153PyAPI_DATA(PyObject *) PyExc_ImportWarning;
154PyAPI_DATA(PyObject *) PyExc_UnicodeWarning;
155PyAPI_DATA(PyObject *) PyExc_BytesWarning;
156PyAPI_DATA(PyObject *) PyExc_EncodingWarning;
157PyAPI_DATA(PyObject *) PyExc_ResourceWarning;
158
159
160/* Convenience functions */
161
162PyAPI_FUNC(int) PyErr_BadArgument(void);
163PyAPI_FUNC(PyObject *) PyErr_NoMemory(void);
164PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *);
165PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject(
166    PyObject *, PyObject *);
167#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
168PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects(
169    PyObject *, PyObject *, PyObject *);
170#endif
171PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename(
172    PyObject *exc,
173    const char *filename   /* decoded from the filesystem encoding */
174    );
175
176PyAPI_FUNC(PyObject *) PyErr_Format(
177    PyObject *exception,
178    const char *format,   /* ASCII-encoded string  */
179    ...
180    );
181#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
182PyAPI_FUNC(PyObject *) PyErr_FormatV(
183    PyObject *exception,
184    const char *format,
185    va_list vargs);
186#endif
187
188#ifdef MS_WINDOWS
189PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(
190    int ierr,
191    const char *filename        /* decoded from the filesystem encoding */
192    );
193PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int);
194PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject(
195    PyObject *,int, PyObject *);
196#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
197PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects(
198    PyObject *,int, PyObject *, PyObject *);
199#endif
200PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename(
201    PyObject *exc,
202    int ierr,
203    const char *filename        /* decoded from the filesystem encoding */
204    );
205PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
206#endif /* MS_WINDOWS */
207
208#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
209PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *,
210    PyObject *, PyObject *);
211#endif
212#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
213PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
214    PyObject *);
215#endif
216
217/* Export the old function so that the existing API remains available: */
218PyAPI_FUNC(void) PyErr_BadInternalCall(void);
219PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno);
220/* Mask the old API with a call to the new API for code compiled under
221   Python 2.0: */
222#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
223
224/* Function to create a new exception */
225PyAPI_FUNC(PyObject *) PyErr_NewException(
226    const char *name, PyObject *base, PyObject *dict);
227PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc(
228    const char *name, const char *doc, PyObject *base, PyObject *dict);
229PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *);
230
231
232/* In signalmodule.c */
233PyAPI_FUNC(int) PyErr_CheckSignals(void);
234PyAPI_FUNC(void) PyErr_SetInterrupt(void);
235#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000
236PyAPI_FUNC(int) PyErr_SetInterruptEx(int signum);
237#endif
238
239/* Support for adding program text to SyntaxErrors */
240PyAPI_FUNC(void) PyErr_SyntaxLocation(
241    const char *filename,       /* decoded from the filesystem encoding */
242    int lineno);
243PyAPI_FUNC(void) PyErr_SyntaxLocationEx(
244    const char *filename,       /* decoded from the filesystem encoding */
245    int lineno,
246    int col_offset);
247PyAPI_FUNC(PyObject *) PyErr_ProgramText(
248    const char *filename,       /* decoded from the filesystem encoding */
249    int lineno);
250
251/* The following functions are used to create and modify unicode
252   exceptions from C */
253
254/* create a UnicodeDecodeError object */
255PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create(
256    const char *encoding,       /* UTF-8 encoded string */
257    const char *object,
258    Py_ssize_t length,
259    Py_ssize_t start,
260    Py_ssize_t end,
261    const char *reason          /* UTF-8 encoded string */
262    );
263
264/* get the encoding attribute */
265PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *);
266PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *);
267
268/* get the object attribute */
269PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *);
270PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *);
271PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *);
272
273/* get the value of the start attribute (the int * may not be NULL)
274   return 0 on success, -1 on failure */
275PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *);
276PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *);
277PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *);
278
279/* assign a new value to the start attribute
280   return 0 on success, -1 on failure */
281PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t);
282PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t);
283PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t);
284
285/* get the value of the end attribute (the int *may not be NULL)
286 return 0 on success, -1 on failure */
287PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *);
288PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *);
289PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *);
290
291/* assign a new value to the end attribute
292   return 0 on success, -1 on failure */
293PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t);
294PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t);
295PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t);
296
297/* get the value of the reason attribute */
298PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *);
299PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *);
300PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *);
301
302/* assign a new value to the reason attribute
303   return 0 on success, -1 on failure */
304PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason(
305    PyObject *exc,
306    const char *reason          /* UTF-8 encoded string */
307    );
308PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason(
309    PyObject *exc,
310    const char *reason          /* UTF-8 encoded string */
311    );
312PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason(
313    PyObject *exc,
314    const char *reason          /* UTF-8 encoded string */
315    );
316
317PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char  *format, ...)
318                        Py_GCC_ATTRIBUTE((format(printf, 3, 4)));
319PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
320                        Py_GCC_ATTRIBUTE((format(printf, 3, 0)));
321
322#ifndef Py_LIMITED_API
323#  define Py_CPYTHON_ERRORS_H
324#  include "cpython/pyerrors.h"
325#  undef Py_CPYTHON_ERRORS_H
326#endif
327
328#ifdef __cplusplus
329}
330#endif
331#endif /* !Py_ERRORS_H */
332