blob: 72a132b3bf2426c2b57404d4a12613fb6e4f77ce [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 Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum373c8691997-04-29 18:22:47 +000017/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Guido van Rossum373c8691997-04-29 18:22:47 +000019#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000020
Jack Janseneceb3e31995-06-27 13:15:15 +000021#ifdef SYMANTEC__CFM68K__
Guido van Rossume9fbc091995-02-18 14:52:19 +000022#pragma lib_export on
23#endif
24
Jack Jansen8fd2d941994-12-14 12:54:54 +000025#ifdef macintosh
Guido van Rossum373c8691997-04-29 18:22:47 +000026extern char *PyMac_StrError Py_PROTO((int));
Jack Jansen5ef86d51995-01-19 12:16:44 +000027#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +000028#define strerror PyMac_StrError
29#endif /* macintosh */
30
Guido van Rossum53e8d441995-03-09 12:11:31 +000031#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000032#ifndef MS_WINDOWS
Guido van Rossum373c8691997-04-29 18:22:47 +000033extern char *strerror Py_PROTO((int));
Guido van Rossum53e8d441995-03-09 12:11:31 +000034#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000035#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000036
Guido van Rossum743007d1999-04-21 15:27:31 +000037#ifdef MS_WIN32
38#include "windows.h"
39#include "winbase.h"
40#endif
41
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042void
Guido van Rossuma027efa1997-05-05 20:56:21 +000043PyErr_Restore(type, value, traceback)
44 PyObject *type;
Guido van Rossum373c8691997-04-29 18:22:47 +000045 PyObject *value;
46 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000047{
Guido van Rossum885553e1998-12-21 18:33:30 +000048 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000049 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050
Guido van Rossuma027efa1997-05-05 20:56:21 +000051 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
52 /* XXX Should never happen -- fatal error instead? */
53 Py_DECREF(traceback);
54 traceback = NULL;
55 }
56
57 /* Save these in locals to safeguard against recursive
58 invocation through Py_XDECREF */
59 oldtype = tstate->curexc_type;
60 oldvalue = tstate->curexc_value;
61 oldtraceback = tstate->curexc_traceback;
62
63 tstate->curexc_type = type;
64 tstate->curexc_value = value;
65 tstate->curexc_traceback = traceback;
66
67 Py_XDECREF(oldtype);
68 Py_XDECREF(oldvalue);
69 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070}
71
72void
Guido van Rossum373c8691997-04-29 18:22:47 +000073PyErr_SetObject(exception, value)
74 PyObject *exception;
75 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Guido van Rossum373c8691997-04-29 18:22:47 +000077 Py_XINCREF(exception);
78 Py_XINCREF(value);
79 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080}
81
82void
Guido van Rossum373c8691997-04-29 18:22:47 +000083PyErr_SetNone(exception)
84 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085{
Guido van Rossum373c8691997-04-29 18:22:47 +000086 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087}
88
89void
Guido van Rossum373c8691997-04-29 18:22:47 +000090PyErr_SetString(exception, string)
91 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +000092 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
Guido van Rossum373c8691997-04-29 18:22:47 +000094 PyObject *value = PyString_FromString(string);
95 PyErr_SetObject(exception, value);
96 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
Guido van Rossum3a241811994-08-29 12:14:12 +000099
Guido van Rossum373c8691997-04-29 18:22:47 +0000100PyObject *
101PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103 PyThreadState *tstate = PyThreadState_Get();
104
105 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000108
109int
110PyErr_GivenExceptionMatches(err, exc)
111 PyObject *err, *exc;
112{
Barry Warsawfa5c3152000-05-02 19:27:51 +0000113 if (err == NULL || exc == NULL) {
114 /* maybe caused by "import exceptions" that failed early on */
115 return 0;
116 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000117 if (PyTuple_Check(exc)) {
118 int i, n;
119 n = PyTuple_Size(exc);
120 for (i = 0; i < n; i++) {
121 /* Test recursively */
122 if (PyErr_GivenExceptionMatches(
123 err, PyTuple_GET_ITEM(exc, i)))
124 {
125 return 1;
126 }
127 }
128 return 0;
129 }
130 /* err might be an instance, so check its class. */
131 if (PyInstance_Check(err))
132 err = (PyObject*)((PyInstanceObject*)err)->in_class;
133
134 if (PyClass_Check(err) && PyClass_Check(exc))
135 return PyClass_IsSubclass(err, exc);
136
137 return err == exc;
138}
Guido van Rossum743007d1999-04-21 15:27:31 +0000139
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000140
141int
142PyErr_ExceptionMatches(exc)
143 PyObject *exc;
144{
145 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
146}
147
148
149/* Used in many places to normalize a raised exception, including in
150 eval_code2(), do_raise(), and PyErr_Print()
151*/
152void
153PyErr_NormalizeException(exc, val, tb)
154 PyObject **exc;
155 PyObject **val;
156 PyObject **tb;
157{
158 PyObject *type = *exc;
159 PyObject *value = *val;
160 PyObject *inclass = NULL;
161
162 /* If PyErr_SetNone() was used, the value will have been actually
163 set to NULL.
164 */
165 if (!value) {
166 value = Py_None;
167 Py_INCREF(value);
168 }
169
170 if (PyInstance_Check(value))
171 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
172
173 /* Normalize the exception so that if the type is a class, the
174 value will be an instance.
175 */
176 if (PyClass_Check(type)) {
177 /* if the value was not an instance, or is not an instance
178 whose class is (or is derived from) type, then use the
179 value as an argument to instantiation of the type
180 class.
181 */
182 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
183 PyObject *args, *res;
184
185 if (value == Py_None)
186 args = Py_BuildValue("()");
187 else if (PyTuple_Check(value)) {
188 Py_INCREF(value);
189 args = value;
190 }
191 else
192 args = Py_BuildValue("(O)", value);
193
194 if (args == NULL)
195 goto finally;
196 res = PyEval_CallObject(type, args);
197 Py_DECREF(args);
198 if (res == NULL)
199 goto finally;
200 Py_DECREF(value);
201 value = res;
202 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000203 /* if the class of the instance doesn't exactly match the
204 class of the type, believe the instance
205 */
206 else if (inclass != type) {
207 Py_DECREF(type);
208 type = inclass;
209 Py_INCREF(type);
210 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000211 }
212 *exc = type;
213 *val = value;
214 return;
215finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000216 Py_DECREF(type);
217 Py_DECREF(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000218 Py_XDECREF(*tb);
219 PyErr_Fetch(exc, val, tb);
220 /* normalize recursively */
221 PyErr_NormalizeException(exc, val, tb);
222}
223
224
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000226PyErr_Fetch(p_type, p_value, p_traceback)
227 PyObject **p_type;
228 PyObject **p_value;
229 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 PyThreadState *tstate = PyThreadState_Get();
232
233 *p_type = tstate->curexc_type;
234 *p_value = tstate->curexc_value;
235 *p_traceback = tstate->curexc_traceback;
236
237 tstate->curexc_type = NULL;
238 tstate->curexc_value = NULL;
239 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240}
241
242void
Guido van Rossum373c8691997-04-29 18:22:47 +0000243PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000247
248/* Convenience functions to set a type error exception and return 0 */
249
250int
Guido van Rossum373c8691997-04-29 18:22:47 +0000251PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000252{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000253 PyErr_SetString(PyExc_TypeError,
254 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000255 return 0;
256}
257
Guido van Rossum373c8691997-04-29 18:22:47 +0000258PyObject *
259PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000260{
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000261 /* raise the pre-allocated instance if it still exists */
262 if (PyExc_MemoryErrorInst)
263 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
264 else
265 /* this will probably fail since there's no memory and hee,
266 hee, we have to instantiate this class
267 */
268 PyErr_SetNone(PyExc_MemoryError);
269
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000270 return NULL;
271}
272
Guido van Rossum373c8691997-04-29 18:22:47 +0000273PyObject *
Barry Warsaw97d95151998-07-23 16:05:56 +0000274PyErr_SetFromErrnoWithFilename(exc, filename)
Guido van Rossum373c8691997-04-29 18:22:47 +0000275 PyObject *exc;
Barry Warsaw97d95151998-07-23 16:05:56 +0000276 char *filename;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000277{
Guido van Rossum373c8691997-04-29 18:22:47 +0000278 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000279 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000280 int i = errno;
Guido van Rossum795e1892000-02-17 15:19:15 +0000281#ifdef MS_WIN32
282 char *s_buf = NULL;
283#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000284#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000285 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000286 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000287#endif
Guido van Rossume0e59821998-10-14 20:38:13 +0000288 if (i == 0)
289 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000290 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000291#ifndef MS_WIN32
Guido van Rossume0e59821998-10-14 20:38:13 +0000292 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000293#else
294 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000295 /* Note that the Win32 errors do not lineup with the
296 errno error. So if the error is in the MSVC error
297 table, we use it, otherwise we assume it really _is_
298 a Win32 error code
299 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000300 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000301 s = _sys_errlist[i];
302 }
303 else {
304 int len = FormatMessage(
305 FORMAT_MESSAGE_ALLOCATE_BUFFER |
306 FORMAT_MESSAGE_FROM_SYSTEM |
307 FORMAT_MESSAGE_IGNORE_INSERTS,
308 NULL, /* no message source */
309 i,
310 MAKELANGID(LANG_NEUTRAL,
311 SUBLANG_DEFAULT),
312 /* Default language */
313 (LPTSTR) &s_buf,
314 0, /* size not used */
315 NULL); /* no args */
316 s = s_buf;
317 /* remove trailing cr/lf and dots */
318 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
319 s[--len] = '\0';
320 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000321 }
322#endif
Barry Warsawfa5c3152000-05-02 19:27:51 +0000323 if (filename != NULL)
Guido van Rossume0e59821998-10-14 20:38:13 +0000324 v = Py_BuildValue("(iss)", i, s, filename);
325 else
326 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000327 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000328 PyErr_SetObject(exc, v);
329 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000330 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000331#ifdef MS_WIN32
Guido van Rossum795e1892000-02-17 15:19:15 +0000332 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000333#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000334 return NULL;
335}
Guido van Rossum743007d1999-04-21 15:27:31 +0000336
Barry Warsaw97d95151998-07-23 16:05:56 +0000337
338PyObject *
339PyErr_SetFromErrno(exc)
340 PyObject *exc;
341{
342 return PyErr_SetFromErrnoWithFilename(exc, NULL);
343}
Guido van Rossum683a0721990-10-21 22:09:12 +0000344
Guido van Rossum795e1892000-02-17 15:19:15 +0000345#ifdef MS_WINDOWS
346/* Windows specific error code handling */
347PyObject *PyErr_SetFromWindowsErrWithFilename(
348 int ierr,
349 const char *filename)
350{
351 int len;
352 char *s;
353 PyObject *v;
354 DWORD err = (DWORD)ierr;
355 if (err==0) err = GetLastError();
356 len = FormatMessage(
357 /* Error API error */
358 FORMAT_MESSAGE_ALLOCATE_BUFFER |
359 FORMAT_MESSAGE_FROM_SYSTEM |
360 FORMAT_MESSAGE_IGNORE_INSERTS,
361 NULL, /* no message source */
362 err,
363 MAKELANGID(LANG_NEUTRAL,
364 SUBLANG_DEFAULT), /* Default language */
365 (LPTSTR) &s,
366 0, /* size not used */
367 NULL); /* no args */
368 /* remove trailing cr/lf and dots */
369 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
370 s[--len] = '\0';
Barry Warsawfa5c3152000-05-02 19:27:51 +0000371 if (filename != NULL)
Guido van Rossum795e1892000-02-17 15:19:15 +0000372 v = Py_BuildValue("(iss)", err, s, filename);
373 else
374 v = Py_BuildValue("(is)", err, s);
375 if (v != NULL) {
Guido van Rossum0b556702000-03-02 13:55:01 +0000376 PyErr_SetObject(PyExc_WindowsError, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000377 Py_DECREF(v);
378 }
379 LocalFree(s);
380 return NULL;
381}
382
383PyObject *PyErr_SetFromWindowsErr(int ierr)
384{
385 return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
386
387}
388#endif /* MS_WINDOWS */
389
Guido van Rossum683a0721990-10-21 22:09:12 +0000390void
Guido van Rossum373c8691997-04-29 18:22:47 +0000391PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000392{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000393 PyErr_SetString(PyExc_SystemError,
394 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000395}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000396
397
398#ifdef HAVE_STDARG_PROTOTYPES
399PyObject *
400PyErr_Format(PyObject *exception, const char *format, ...)
401#else
402PyObject *
403PyErr_Format(exception, format, va_alist)
404 PyObject *exception;
405 const char *format;
406 va_dcl
407#endif
408{
409 va_list vargs;
410 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000411
412#ifdef HAVE_STDARG_PROTOTYPES
413 va_start(vargs, format);
414#else
415 va_start(vargs);
416#endif
417
418 vsprintf(buffer, format, vargs);
419 PyErr_SetString(exception, buffer);
420 return NULL;
421}
Guido van Rossum7617e051997-09-16 18:43:50 +0000422
423
424PyObject *
425PyErr_NewException(name, base, dict)
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000426 char *name; /* modulename.classname */
Guido van Rossum7617e051997-09-16 18:43:50 +0000427 PyObject *base;
428 PyObject *dict;
429{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000430 char *dot;
431 PyObject *modulename = NULL;
432 PyObject *classname = NULL;
433 PyObject *mydict = NULL;
434 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000435 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000436 dot = strrchr(name, '.');
437 if (dot == NULL) {
438 PyErr_SetString(PyExc_SystemError,
439 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000440 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000441 }
442 if (base == NULL)
443 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000444 if (!PyClass_Check(base)) {
445 /* Must be using string-based standard exceptions (-X) */
446 return PyString_FromString(name);
447 }
448 if (dict == NULL) {
449 dict = mydict = PyDict_New();
450 if (dict == NULL)
451 goto failure;
452 }
453 if (PyDict_GetItemString(dict, "__module__") == NULL) {
454 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
455 if (modulename == NULL)
456 goto failure;
457 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
458 goto failure;
459 }
460 classname = PyString_FromString(dot+1);
461 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000462 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000463 bases = Py_BuildValue("(O)", base);
464 if (bases == NULL)
465 goto failure;
466 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000467 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000468 Py_XDECREF(bases);
469 Py_XDECREF(mydict);
470 Py_XDECREF(classname);
471 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000472 return result;
473}