mirror of
https://github.com/python/cpython.git
synced 2024-12-15 12:54:31 +08:00
5dbe0f59b7
- drop TargetScopeError in favour of raising SyntaxError directly as per the updated PEP 572 - comprehension iteration variables are explicitly local, but named expression targets in comprehensions are nonlocal or global. Raise SyntaxError as specified in PEP 572 - named expression targets in the outermost iterable of a comprehension have an ambiguous target scope. Avoid resolving that question now by raising SyntaxError. PEP 572 originally required this only for cases where the bound name conflicts with the iteration variable in the comprehension, but CPython can't easily restrict the exception to that case (as it doesn't know the target variable names when visiting the outermost iterator expression)
336 lines
12 KiB
C
336 lines
12 KiB
C
#ifndef Py_ERRORS_H
|
|
#define Py_ERRORS_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Error handling definitions */
|
|
|
|
PyAPI_FUNC(void) PyErr_SetNone(PyObject *);
|
|
PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *);
|
|
PyAPI_FUNC(void) PyErr_SetString(
|
|
PyObject *exception,
|
|
const char *string /* decoded from utf-8 */
|
|
);
|
|
PyAPI_FUNC(PyObject *) PyErr_Occurred(void);
|
|
PyAPI_FUNC(void) PyErr_Clear(void);
|
|
PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **);
|
|
PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *);
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
|
|
PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
|
|
PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
|
|
#endif
|
|
|
|
/* Defined in Python/pylifecycle.c */
|
|
PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message);
|
|
|
|
#if defined(Py_DEBUG) || defined(Py_LIMITED_API)
|
|
#define _PyErr_OCCURRED() PyErr_Occurred()
|
|
#else
|
|
#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type)
|
|
#endif
|
|
|
|
/* Error testing and normalization */
|
|
PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *);
|
|
PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *);
|
|
PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**);
|
|
|
|
/* Traceback manipulation (PEP 3134) */
|
|
PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *);
|
|
|
|
/* Cause manipulation (PEP 3134) */
|
|
PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *);
|
|
PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *);
|
|
|
|
/* Context manipulation (PEP 3134) */
|
|
PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *);
|
|
PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *);
|
|
|
|
/* */
|
|
|
|
#define PyExceptionClass_Check(x) \
|
|
(PyType_Check((x)) && \
|
|
PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
|
|
|
|
#define PyExceptionInstance_Check(x) \
|
|
PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)
|
|
|
|
PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *);
|
|
|
|
#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type))
|
|
|
|
|
|
/* Predefined exceptions */
|
|
|
|
PyAPI_DATA(PyObject *) PyExc_BaseException;
|
|
PyAPI_DATA(PyObject *) PyExc_Exception;
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
|
|
PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration;
|
|
#endif
|
|
PyAPI_DATA(PyObject *) PyExc_StopIteration;
|
|
PyAPI_DATA(PyObject *) PyExc_GeneratorExit;
|
|
PyAPI_DATA(PyObject *) PyExc_ArithmeticError;
|
|
PyAPI_DATA(PyObject *) PyExc_LookupError;
|
|
|
|
PyAPI_DATA(PyObject *) PyExc_AssertionError;
|
|
PyAPI_DATA(PyObject *) PyExc_AttributeError;
|
|
PyAPI_DATA(PyObject *) PyExc_BufferError;
|
|
PyAPI_DATA(PyObject *) PyExc_EOFError;
|
|
PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
|
|
PyAPI_DATA(PyObject *) PyExc_OSError;
|
|
PyAPI_DATA(PyObject *) PyExc_ImportError;
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
|
|
PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError;
|
|
#endif
|
|
PyAPI_DATA(PyObject *) PyExc_IndexError;
|
|
PyAPI_DATA(PyObject *) PyExc_KeyError;
|
|
PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt;
|
|
PyAPI_DATA(PyObject *) PyExc_MemoryError;
|
|
PyAPI_DATA(PyObject *) PyExc_NameError;
|
|
PyAPI_DATA(PyObject *) PyExc_OverflowError;
|
|
PyAPI_DATA(PyObject *) PyExc_RuntimeError;
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
|
|
PyAPI_DATA(PyObject *) PyExc_RecursionError;
|
|
#endif
|
|
PyAPI_DATA(PyObject *) PyExc_NotImplementedError;
|
|
PyAPI_DATA(PyObject *) PyExc_SyntaxError;
|
|
PyAPI_DATA(PyObject *) PyExc_IndentationError;
|
|
PyAPI_DATA(PyObject *) PyExc_TabError;
|
|
PyAPI_DATA(PyObject *) PyExc_ReferenceError;
|
|
PyAPI_DATA(PyObject *) PyExc_SystemError;
|
|
PyAPI_DATA(PyObject *) PyExc_SystemExit;
|
|
PyAPI_DATA(PyObject *) PyExc_TypeError;
|
|
PyAPI_DATA(PyObject *) PyExc_UnboundLocalError;
|
|
PyAPI_DATA(PyObject *) PyExc_UnicodeError;
|
|
PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError;
|
|
PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError;
|
|
PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
|
|
PyAPI_DATA(PyObject *) PyExc_ValueError;
|
|
PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
|
|
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
|
|
PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
|
|
PyAPI_DATA(PyObject *) PyExc_BrokenPipeError;
|
|
PyAPI_DATA(PyObject *) PyExc_ChildProcessError;
|
|
PyAPI_DATA(PyObject *) PyExc_ConnectionError;
|
|
PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError;
|
|
PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError;
|
|
PyAPI_DATA(PyObject *) PyExc_ConnectionResetError;
|
|
PyAPI_DATA(PyObject *) PyExc_FileExistsError;
|
|
PyAPI_DATA(PyObject *) PyExc_FileNotFoundError;
|
|
PyAPI_DATA(PyObject *) PyExc_InterruptedError;
|
|
PyAPI_DATA(PyObject *) PyExc_IsADirectoryError;
|
|
PyAPI_DATA(PyObject *) PyExc_NotADirectoryError;
|
|
PyAPI_DATA(PyObject *) PyExc_PermissionError;
|
|
PyAPI_DATA(PyObject *) PyExc_ProcessLookupError;
|
|
PyAPI_DATA(PyObject *) PyExc_TimeoutError;
|
|
#endif
|
|
|
|
|
|
/* Compatibility aliases */
|
|
PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
|
|
PyAPI_DATA(PyObject *) PyExc_IOError;
|
|
#ifdef MS_WINDOWS
|
|
PyAPI_DATA(PyObject *) PyExc_WindowsError;
|
|
#endif
|
|
|
|
/* Predefined warning categories */
|
|
PyAPI_DATA(PyObject *) PyExc_Warning;
|
|
PyAPI_DATA(PyObject *) PyExc_UserWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_DeprecationWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_SyntaxWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_RuntimeWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_FutureWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_ImportWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_UnicodeWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_BytesWarning;
|
|
PyAPI_DATA(PyObject *) PyExc_ResourceWarning;
|
|
|
|
|
|
/* Convenience functions */
|
|
|
|
PyAPI_FUNC(int) PyErr_BadArgument(void);
|
|
PyAPI_FUNC(PyObject *) PyErr_NoMemory(void);
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject(
|
|
PyObject *, PyObject *);
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects(
|
|
PyObject *, PyObject *, PyObject *);
|
|
#endif
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename(
|
|
PyObject *exc,
|
|
const char *filename /* decoded from the filesystem encoding */
|
|
);
|
|
|
|
PyAPI_FUNC(PyObject *) PyErr_Format(
|
|
PyObject *exception,
|
|
const char *format, /* ASCII-encoded string */
|
|
...
|
|
);
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
|
|
PyAPI_FUNC(PyObject *) PyErr_FormatV(
|
|
PyObject *exception,
|
|
const char *format,
|
|
va_list vargs);
|
|
#endif
|
|
|
|
#ifdef MS_WINDOWS
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(
|
|
int ierr,
|
|
const char *filename /* decoded from the filesystem encoding */
|
|
);
|
|
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int);
|
|
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject(
|
|
PyObject *,int, PyObject *);
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
|
|
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects(
|
|
PyObject *,int, PyObject *, PyObject *);
|
|
#endif
|
|
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename(
|
|
PyObject *exc,
|
|
int ierr,
|
|
const char *filename /* decoded from the filesystem encoding */
|
|
);
|
|
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
|
|
#endif /* MS_WINDOWS */
|
|
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
|
|
PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *,
|
|
PyObject *, PyObject *);
|
|
#endif
|
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
|
|
PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
|
|
PyObject *);
|
|
#endif
|
|
|
|
/* Export the old function so that the existing API remains available: */
|
|
PyAPI_FUNC(void) PyErr_BadInternalCall(void);
|
|
PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno);
|
|
/* Mask the old API with a call to the new API for code compiled under
|
|
Python 2.0: */
|
|
#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
|
|
|
|
/* Function to create a new exception */
|
|
PyAPI_FUNC(PyObject *) PyErr_NewException(
|
|
const char *name, PyObject *base, PyObject *dict);
|
|
PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc(
|
|
const char *name, const char *doc, PyObject *base, PyObject *dict);
|
|
PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *);
|
|
|
|
|
|
/* In signalmodule.c */
|
|
PyAPI_FUNC(int) PyErr_CheckSignals(void);
|
|
PyAPI_FUNC(void) PyErr_SetInterrupt(void);
|
|
|
|
/* Support for adding program text to SyntaxErrors */
|
|
PyAPI_FUNC(void) PyErr_SyntaxLocation(
|
|
const char *filename, /* decoded from the filesystem encoding */
|
|
int lineno);
|
|
PyAPI_FUNC(void) PyErr_SyntaxLocationEx(
|
|
const char *filename, /* decoded from the filesystem encoding */
|
|
int lineno,
|
|
int col_offset);
|
|
PyAPI_FUNC(PyObject *) PyErr_ProgramText(
|
|
const char *filename, /* decoded from the filesystem encoding */
|
|
int lineno);
|
|
|
|
/* The following functions are used to create and modify unicode
|
|
exceptions from C */
|
|
|
|
/* create a UnicodeDecodeError object */
|
|
PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create(
|
|
const char *encoding, /* UTF-8 encoded string */
|
|
const char *object,
|
|
Py_ssize_t length,
|
|
Py_ssize_t start,
|
|
Py_ssize_t end,
|
|
const char *reason /* UTF-8 encoded string */
|
|
);
|
|
|
|
/* get the encoding attribute */
|
|
PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *);
|
|
|
|
/* get the object attribute */
|
|
PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *);
|
|
|
|
/* get the value of the start attribute (the int * may not be NULL)
|
|
return 0 on success, -1 on failure */
|
|
PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *);
|
|
PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *);
|
|
PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *);
|
|
|
|
/* assign a new value to the start attribute
|
|
return 0 on success, -1 on failure */
|
|
PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t);
|
|
PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t);
|
|
PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t);
|
|
|
|
/* get the value of the end attribute (the int *may not be NULL)
|
|
return 0 on success, -1 on failure */
|
|
PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *);
|
|
PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *);
|
|
PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *);
|
|
|
|
/* assign a new value to the end attribute
|
|
return 0 on success, -1 on failure */
|
|
PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t);
|
|
PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t);
|
|
PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t);
|
|
|
|
/* get the value of the reason attribute */
|
|
PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *);
|
|
PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *);
|
|
|
|
/* assign a new value to the reason attribute
|
|
return 0 on success, -1 on failure */
|
|
PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason(
|
|
PyObject *exc,
|
|
const char *reason /* UTF-8 encoded string */
|
|
);
|
|
PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason(
|
|
PyObject *exc,
|
|
const char *reason /* UTF-8 encoded string */
|
|
);
|
|
PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason(
|
|
PyObject *exc,
|
|
const char *reason /* UTF-8 encoded string */
|
|
);
|
|
|
|
/* These APIs aren't really part of the error implementation, but
|
|
often needed to format error messages; the native C lib APIs are
|
|
not available on all platforms, which is why we provide emulations
|
|
for those platforms in Python/mysnprintf.c,
|
|
WARNING: The return value of snprintf varies across platforms; do
|
|
not rely on any particular behavior; eventually the C99 defn may
|
|
be reliable.
|
|
*/
|
|
#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF)
|
|
# define HAVE_SNPRINTF
|
|
# define snprintf _snprintf
|
|
# define vsnprintf _vsnprintf
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...)
|
|
Py_GCC_ATTRIBUTE((format(printf, 3, 4)));
|
|
PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
|
|
Py_GCC_ATTRIBUTE((format(printf, 3, 0)));
|
|
|
|
#ifndef Py_LIMITED_API
|
|
# define Py_CPYTHON_ERRORS_H
|
|
# include "cpython/pyerrors.h"
|
|
# undef Py_CPYTHON_ERRORS_H
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_ERRORS_H */
|