blob: 2b6a86344ba5dea6f495d95262183116cb443867 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum373c8691997-04-29 18:22:47 +000011/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Guido van Rossum373c8691997-04-29 18:22:47 +000013#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000014
Jack Jansen8fd2d941994-12-14 12:54:54 +000015#ifdef macintosh
Tim Petersdbd9ba62000-07-09 03:09:57 +000016extern char *PyMac_StrError(int);
Jack Jansen5ef86d51995-01-19 12:16:44 +000017#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +000018#define strerror PyMac_StrError
19#endif /* macintosh */
20
Guido van Rossum53e8d441995-03-09 12:11:31 +000021#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000022#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000023extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000024#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000025#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000026
Guido van Rossum743007d1999-04-21 15:27:31 +000027#ifdef MS_WIN32
28#include "windows.h"
29#include "winbase.h"
30#endif
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032void
Guido van Rossuma027efa1997-05-05 20:56:21 +000033PyErr_Restore(type, value, traceback)
34 PyObject *type;
Guido van Rossum373c8691997-04-29 18:22:47 +000035 PyObject *value;
36 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000037{
Guido van Rossum885553e1998-12-21 18:33:30 +000038 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000039 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000040
Guido van Rossuma027efa1997-05-05 20:56:21 +000041 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
42 /* XXX Should never happen -- fatal error instead? */
43 Py_DECREF(traceback);
44 traceback = NULL;
45 }
46
47 /* Save these in locals to safeguard against recursive
48 invocation through Py_XDECREF */
49 oldtype = tstate->curexc_type;
50 oldvalue = tstate->curexc_value;
51 oldtraceback = tstate->curexc_traceback;
52
53 tstate->curexc_type = type;
54 tstate->curexc_value = value;
55 tstate->curexc_traceback = traceback;
56
57 Py_XDECREF(oldtype);
58 Py_XDECREF(oldvalue);
59 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060}
61
62void
Guido van Rossum373c8691997-04-29 18:22:47 +000063PyErr_SetObject(exception, value)
64 PyObject *exception;
65 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066{
Guido van Rossum373c8691997-04-29 18:22:47 +000067 Py_XINCREF(exception);
68 Py_XINCREF(value);
69 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070}
71
72void
Guido van Rossum373c8691997-04-29 18:22:47 +000073PyErr_SetNone(exception)
74 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075{
Guido van Rossum373c8691997-04-29 18:22:47 +000076 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077}
78
79void
Guido van Rossum373c8691997-04-29 18:22:47 +000080PyErr_SetString(exception, string)
81 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +000082 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083{
Guido van Rossum373c8691997-04-29 18:22:47 +000084 PyObject *value = PyString_FromString(string);
85 PyErr_SetObject(exception, value);
86 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087}
88
Guido van Rossum3a241811994-08-29 12:14:12 +000089
Guido van Rossum373c8691997-04-29 18:22:47 +000090PyObject *
91PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
Guido van Rossuma027efa1997-05-05 20:56:21 +000093 PyThreadState *tstate = PyThreadState_Get();
94
95 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096}
97
Barry Warsawc0dc92a1997-08-22 21:22:58 +000098
99int
100PyErr_GivenExceptionMatches(err, exc)
101 PyObject *err, *exc;
102{
Barry Warsawfa5c3152000-05-02 19:27:51 +0000103 if (err == NULL || exc == NULL) {
104 /* maybe caused by "import exceptions" that failed early on */
105 return 0;
106 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000107 if (PyTuple_Check(exc)) {
108 int i, n;
109 n = PyTuple_Size(exc);
110 for (i = 0; i < n; i++) {
111 /* Test recursively */
112 if (PyErr_GivenExceptionMatches(
113 err, PyTuple_GET_ITEM(exc, i)))
114 {
115 return 1;
116 }
117 }
118 return 0;
119 }
120 /* err might be an instance, so check its class. */
121 if (PyInstance_Check(err))
122 err = (PyObject*)((PyInstanceObject*)err)->in_class;
123
124 if (PyClass_Check(err) && PyClass_Check(exc))
125 return PyClass_IsSubclass(err, exc);
126
127 return err == exc;
128}
Guido van Rossum743007d1999-04-21 15:27:31 +0000129
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000130
131int
132PyErr_ExceptionMatches(exc)
133 PyObject *exc;
134{
135 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
136}
137
138
139/* Used in many places to normalize a raised exception, including in
140 eval_code2(), do_raise(), and PyErr_Print()
141*/
142void
143PyErr_NormalizeException(exc, val, tb)
144 PyObject **exc;
145 PyObject **val;
146 PyObject **tb;
147{
148 PyObject *type = *exc;
149 PyObject *value = *val;
150 PyObject *inclass = NULL;
151
152 /* If PyErr_SetNone() was used, the value will have been actually
153 set to NULL.
154 */
155 if (!value) {
156 value = Py_None;
157 Py_INCREF(value);
158 }
159
160 if (PyInstance_Check(value))
161 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
162
163 /* Normalize the exception so that if the type is a class, the
164 value will be an instance.
165 */
166 if (PyClass_Check(type)) {
167 /* if the value was not an instance, or is not an instance
168 whose class is (or is derived from) type, then use the
169 value as an argument to instantiation of the type
170 class.
171 */
172 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
173 PyObject *args, *res;
174
175 if (value == Py_None)
176 args = Py_BuildValue("()");
177 else if (PyTuple_Check(value)) {
178 Py_INCREF(value);
179 args = value;
180 }
181 else
182 args = Py_BuildValue("(O)", value);
183
184 if (args == NULL)
185 goto finally;
186 res = PyEval_CallObject(type, args);
187 Py_DECREF(args);
188 if (res == NULL)
189 goto finally;
190 Py_DECREF(value);
191 value = res;
192 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000193 /* if the class of the instance doesn't exactly match the
194 class of the type, believe the instance
195 */
196 else if (inclass != type) {
197 Py_DECREF(type);
198 type = inclass;
199 Py_INCREF(type);
200 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000201 }
202 *exc = type;
203 *val = value;
204 return;
205finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000206 Py_DECREF(type);
207 Py_DECREF(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000208 Py_XDECREF(*tb);
209 PyErr_Fetch(exc, val, tb);
210 /* normalize recursively */
211 PyErr_NormalizeException(exc, val, tb);
212}
213
214
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000216PyErr_Fetch(p_type, p_value, p_traceback)
217 PyObject **p_type;
218 PyObject **p_value;
219 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000221 PyThreadState *tstate = PyThreadState_Get();
222
223 *p_type = tstate->curexc_type;
224 *p_value = tstate->curexc_value;
225 *p_traceback = tstate->curexc_traceback;
226
227 tstate->curexc_type = NULL;
228 tstate->curexc_value = NULL;
229 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230}
231
232void
Guido van Rossum373c8691997-04-29 18:22:47 +0000233PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000237
238/* Convenience functions to set a type error exception and return 0 */
239
240int
Guido van Rossum373c8691997-04-29 18:22:47 +0000241PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000242{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243 PyErr_SetString(PyExc_TypeError,
244 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000245 return 0;
246}
247
Guido van Rossum373c8691997-04-29 18:22:47 +0000248PyObject *
249PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000250{
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000251 /* raise the pre-allocated instance if it still exists */
252 if (PyExc_MemoryErrorInst)
253 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
254 else
255 /* this will probably fail since there's no memory and hee,
256 hee, we have to instantiate this class
257 */
258 PyErr_SetNone(PyExc_MemoryError);
259
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000260 return NULL;
261}
262
Guido van Rossum373c8691997-04-29 18:22:47 +0000263PyObject *
Barry Warsaw97d95151998-07-23 16:05:56 +0000264PyErr_SetFromErrnoWithFilename(exc, filename)
Guido van Rossum373c8691997-04-29 18:22:47 +0000265 PyObject *exc;
Barry Warsaw97d95151998-07-23 16:05:56 +0000266 char *filename;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000267{
Guido van Rossum373c8691997-04-29 18:22:47 +0000268 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000269 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000270 int i = errno;
Guido van Rossum795e1892000-02-17 15:19:15 +0000271#ifdef MS_WIN32
272 char *s_buf = NULL;
273#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000274#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000275 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000276 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000277#endif
Guido van Rossume0e59821998-10-14 20:38:13 +0000278 if (i == 0)
279 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000280 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000281#ifndef MS_WIN32
Guido van Rossume0e59821998-10-14 20:38:13 +0000282 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000283#else
284 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000285 /* Note that the Win32 errors do not lineup with the
286 errno error. So if the error is in the MSVC error
287 table, we use it, otherwise we assume it really _is_
288 a Win32 error code
289 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000290 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000291 s = _sys_errlist[i];
292 }
293 else {
294 int len = FormatMessage(
295 FORMAT_MESSAGE_ALLOCATE_BUFFER |
296 FORMAT_MESSAGE_FROM_SYSTEM |
297 FORMAT_MESSAGE_IGNORE_INSERTS,
298 NULL, /* no message source */
299 i,
300 MAKELANGID(LANG_NEUTRAL,
301 SUBLANG_DEFAULT),
302 /* Default language */
303 (LPTSTR) &s_buf,
304 0, /* size not used */
305 NULL); /* no args */
306 s = s_buf;
307 /* remove trailing cr/lf and dots */
308 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
309 s[--len] = '\0';
310 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000311 }
312#endif
Barry Warsawfa5c3152000-05-02 19:27:51 +0000313 if (filename != NULL)
Guido van Rossume0e59821998-10-14 20:38:13 +0000314 v = Py_BuildValue("(iss)", i, s, filename);
315 else
316 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000317 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000318 PyErr_SetObject(exc, v);
319 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000320 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000321#ifdef MS_WIN32
Guido van Rossum795e1892000-02-17 15:19:15 +0000322 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000323#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000324 return NULL;
325}
Guido van Rossum743007d1999-04-21 15:27:31 +0000326
Barry Warsaw97d95151998-07-23 16:05:56 +0000327
328PyObject *
329PyErr_SetFromErrno(exc)
330 PyObject *exc;
331{
332 return PyErr_SetFromErrnoWithFilename(exc, NULL);
333}
Guido van Rossum683a0721990-10-21 22:09:12 +0000334
Guido van Rossum795e1892000-02-17 15:19:15 +0000335#ifdef MS_WINDOWS
336/* Windows specific error code handling */
337PyObject *PyErr_SetFromWindowsErrWithFilename(
338 int ierr,
339 const char *filename)
340{
341 int len;
342 char *s;
343 PyObject *v;
344 DWORD err = (DWORD)ierr;
345 if (err==0) err = GetLastError();
346 len = FormatMessage(
347 /* Error API error */
348 FORMAT_MESSAGE_ALLOCATE_BUFFER |
349 FORMAT_MESSAGE_FROM_SYSTEM |
350 FORMAT_MESSAGE_IGNORE_INSERTS,
351 NULL, /* no message source */
352 err,
353 MAKELANGID(LANG_NEUTRAL,
354 SUBLANG_DEFAULT), /* Default language */
355 (LPTSTR) &s,
356 0, /* size not used */
357 NULL); /* no args */
358 /* remove trailing cr/lf and dots */
359 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
360 s[--len] = '\0';
Barry Warsawfa5c3152000-05-02 19:27:51 +0000361 if (filename != NULL)
Guido van Rossum795e1892000-02-17 15:19:15 +0000362 v = Py_BuildValue("(iss)", err, s, filename);
363 else
364 v = Py_BuildValue("(is)", err, s);
365 if (v != NULL) {
Guido van Rossum0b556702000-03-02 13:55:01 +0000366 PyErr_SetObject(PyExc_WindowsError, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000367 Py_DECREF(v);
368 }
369 LocalFree(s);
370 return NULL;
371}
372
373PyObject *PyErr_SetFromWindowsErr(int ierr)
374{
375 return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
376
377}
378#endif /* MS_WINDOWS */
379
Guido van Rossum683a0721990-10-21 22:09:12 +0000380void
Guido van Rossum373c8691997-04-29 18:22:47 +0000381PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000382{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000383 PyErr_SetString(PyExc_SystemError,
384 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000385}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000386
387
388#ifdef HAVE_STDARG_PROTOTYPES
389PyObject *
390PyErr_Format(PyObject *exception, const char *format, ...)
391#else
392PyObject *
393PyErr_Format(exception, format, va_alist)
394 PyObject *exception;
395 const char *format;
396 va_dcl
397#endif
398{
399 va_list vargs;
400 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000401
402#ifdef HAVE_STDARG_PROTOTYPES
403 va_start(vargs, format);
404#else
405 va_start(vargs);
406#endif
407
408 vsprintf(buffer, format, vargs);
409 PyErr_SetString(exception, buffer);
410 return NULL;
411}
Guido van Rossum7617e051997-09-16 18:43:50 +0000412
413
414PyObject *
415PyErr_NewException(name, base, dict)
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000416 char *name; /* modulename.classname */
Guido van Rossum7617e051997-09-16 18:43:50 +0000417 PyObject *base;
418 PyObject *dict;
419{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000420 char *dot;
421 PyObject *modulename = NULL;
422 PyObject *classname = NULL;
423 PyObject *mydict = NULL;
424 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000425 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000426 dot = strrchr(name, '.');
427 if (dot == NULL) {
428 PyErr_SetString(PyExc_SystemError,
429 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000430 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000431 }
432 if (base == NULL)
433 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000434 if (!PyClass_Check(base)) {
435 /* Must be using string-based standard exceptions (-X) */
436 return PyString_FromString(name);
437 }
438 if (dict == NULL) {
439 dict = mydict = PyDict_New();
440 if (dict == NULL)
441 goto failure;
442 }
443 if (PyDict_GetItemString(dict, "__module__") == NULL) {
444 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
445 if (modulename == NULL)
446 goto failure;
447 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
448 goto failure;
449 }
450 classname = PyString_FromString(dot+1);
451 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000452 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000453 bases = Py_BuildValue("(O)", base);
454 if (bases == NULL)
455 goto failure;
456 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000457 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000458 Py_XDECREF(bases);
459 Py_XDECREF(mydict);
460 Py_XDECREF(classname);
461 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000462 return result;
463}