blob: d654b76718d9d2ee5bd48639f96bde1596989bc4 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum373c8691997-04-29 18:22:47 +000032/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossum373c8691997-04-29 18:22:47 +000034#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000035
Jack Janseneceb3e31995-06-27 13:15:15 +000036#ifdef SYMANTEC__CFM68K__
Guido van Rossume9fbc091995-02-18 14:52:19 +000037#pragma lib_export on
38#endif
39
Jack Jansen8fd2d941994-12-14 12:54:54 +000040#ifdef macintosh
Guido van Rossum6976a521997-04-11 19:18:23 +000041#ifndef __MSL__
Guido van Rossume9fbc091995-02-18 14:52:19 +000042/* Replace strerror with a Mac specific routine.
43 XXX PROBLEM: some positive errors have a meaning for MacOS,
44 but some library routines set Unix error numbers...
Jack Jansen8fd2d941994-12-14 12:54:54 +000045*/
Guido van Rossum373c8691997-04-29 18:22:47 +000046extern char *PyMac_StrError Py_PROTO((int));
Jack Jansen5ef86d51995-01-19 12:16:44 +000047#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +000048#define strerror PyMac_StrError
Guido van Rossum6976a521997-04-11 19:18:23 +000049#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +000050#endif /* macintosh */
51
Guido van Rossum53e8d441995-03-09 12:11:31 +000052#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000053#ifndef MS_WINDOWS
Guido van Rossum373c8691997-04-29 18:22:47 +000054extern char *strerror Py_PROTO((int));
Guido van Rossum53e8d441995-03-09 12:11:31 +000055#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000056#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000057
Guido van Rossum373c8691997-04-29 18:22:47 +000058/* Last exception stored */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059
Guido van Rossum373c8691997-04-29 18:22:47 +000060static PyObject *last_exception;
61static PyObject *last_exc_val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062
63void
Guido van Rossum373c8691997-04-29 18:22:47 +000064PyErr_Restore(exception, value, traceback)
65 PyObject *exception;
66 PyObject *value;
67 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068{
Guido van Rossum373c8691997-04-29 18:22:47 +000069 PyErr_Clear();
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070
71 last_exception = exception;
72 last_exc_val = value;
Guido van Rossum373c8691997-04-29 18:22:47 +000073 (void) PyTraceBack_Store(traceback);
74 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000075}
76
77void
Guido van Rossum373c8691997-04-29 18:22:47 +000078PyErr_SetObject(exception, value)
79 PyObject *exception;
80 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Guido van Rossum373c8691997-04-29 18:22:47 +000082 Py_XINCREF(exception);
83 Py_XINCREF(value);
84 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085}
86
87void
Guido van Rossum373c8691997-04-29 18:22:47 +000088PyErr_SetNone(exception)
89 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossum373c8691997-04-29 18:22:47 +000091 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092}
93
94void
Guido van Rossum373c8691997-04-29 18:22:47 +000095PyErr_SetString(exception, string)
96 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +000097 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098{
Guido van Rossum373c8691997-04-29 18:22:47 +000099 PyObject *value = PyString_FromString(string);
100 PyErr_SetObject(exception, value);
101 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102}
103
Guido van Rossum3a241811994-08-29 12:14:12 +0000104
Guido van Rossum373c8691997-04-29 18:22:47 +0000105PyObject *
106PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107{
Guido van Rossum3a241811994-08-29 12:14:12 +0000108 return last_exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
111void
Guido van Rossum373c8691997-04-29 18:22:47 +0000112PyErr_Fetch(p_exc, p_val, p_tb)
113 PyObject **p_exc;
114 PyObject **p_val;
115 PyObject **p_tb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116{
117 *p_exc = last_exception;
118 last_exception = NULL;
119 *p_val = last_exc_val;
120 last_exc_val = NULL;
Guido van Rossum373c8691997-04-29 18:22:47 +0000121 *p_tb = PyTraceBack_Fetch();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122}
123
124void
Guido van Rossum373c8691997-04-29 18:22:47 +0000125PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126{
Guido van Rossum373c8691997-04-29 18:22:47 +0000127 PyObject *tb;
128 Py_XDECREF(last_exception);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129 last_exception = NULL;
Guido van Rossum373c8691997-04-29 18:22:47 +0000130 Py_XDECREF(last_exc_val);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000131 last_exc_val = NULL;
Guido van Rossum6989e541994-09-29 09:39:39 +0000132 /* Also clear interpreter stack trace */
Guido van Rossum373c8691997-04-29 18:22:47 +0000133 tb = PyTraceBack_Fetch();
134 Py_XDECREF(tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000136
137/* Convenience functions to set a type error exception and return 0 */
138
139int
Guido van Rossum373c8691997-04-29 18:22:47 +0000140PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000141{
Guido van Rossum373c8691997-04-29 18:22:47 +0000142 PyErr_SetString(PyExc_TypeError, "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000143 return 0;
144}
145
Guido van Rossum373c8691997-04-29 18:22:47 +0000146PyObject *
147PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000148{
Guido van Rossum373c8691997-04-29 18:22:47 +0000149 PyErr_SetNone(PyExc_MemoryError);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000150 return NULL;
151}
152
Guido van Rossum373c8691997-04-29 18:22:47 +0000153PyObject *
154PyErr_SetFromErrno(exc)
155 PyObject *exc;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000156{
Guido van Rossum373c8691997-04-29 18:22:47 +0000157 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000158 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000159#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000160 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000161 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000162#endif
Guido van Rossum373c8691997-04-29 18:22:47 +0000163 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000164 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000165 PyErr_SetObject(exc, v);
166 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000167 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000168 return NULL;
169}
Guido van Rossum683a0721990-10-21 22:09:12 +0000170
171void
Guido van Rossum373c8691997-04-29 18:22:47 +0000172PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000173{
Guido van Rossum373c8691997-04-29 18:22:47 +0000174 PyErr_SetString(PyExc_SystemError, "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000175}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000176
177
178#ifdef HAVE_STDARG_PROTOTYPES
179PyObject *
180PyErr_Format(PyObject *exception, const char *format, ...)
181#else
182PyObject *
183PyErr_Format(exception, format, va_alist)
184 PyObject *exception;
185 const char *format;
186 va_dcl
187#endif
188{
189 va_list vargs;
190 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000191
192#ifdef HAVE_STDARG_PROTOTYPES
193 va_start(vargs, format);
194#else
195 va_start(vargs);
196#endif
197
198 vsprintf(buffer, format, vargs);
199 PyErr_SetString(exception, buffer);
200 return NULL;
201}