blob: 6469f9f7901462bbf838433fcf4fcd23621bd513 [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
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000032#include <ctype.h>
33
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000035PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000036{
Guido van Rossum885553e1998-12-21 18:33:30 +000037 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000038 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039
Guido van Rossuma027efa1997-05-05 20:56:21 +000040 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
41 /* XXX Should never happen -- fatal error instead? */
42 Py_DECREF(traceback);
43 traceback = NULL;
44 }
45
46 /* Save these in locals to safeguard against recursive
47 invocation through Py_XDECREF */
48 oldtype = tstate->curexc_type;
49 oldvalue = tstate->curexc_value;
50 oldtraceback = tstate->curexc_traceback;
51
52 tstate->curexc_type = type;
53 tstate->curexc_value = value;
54 tstate->curexc_traceback = traceback;
55
56 Py_XDECREF(oldtype);
57 Py_XDECREF(oldvalue);
58 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059}
60
61void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063{
Guido van Rossum373c8691997-04-29 18:22:47 +000064 Py_XINCREF(exception);
65 Py_XINCREF(value);
66 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067}
68
69void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000070PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071{
Guido van Rossum373c8691997-04-29 18:22:47 +000072 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073}
74
75void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000076PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077{
Guido van Rossum373c8691997-04-29 18:22:47 +000078 PyObject *value = PyString_FromString(string);
79 PyErr_SetObject(exception, value);
80 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Guido van Rossum3a241811994-08-29 12:14:12 +000083
Guido van Rossum373c8691997-04-29 18:22:47 +000084PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossuma027efa1997-05-05 20:56:21 +000087 PyThreadState *tstate = PyThreadState_Get();
88
89 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
Barry Warsawc0dc92a1997-08-22 21:22:58 +000092
93int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000094PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000095{
Barry Warsawfa5c3152000-05-02 19:27:51 +000096 if (err == NULL || exc == NULL) {
97 /* maybe caused by "import exceptions" that failed early on */
98 return 0;
99 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000100 if (PyTuple_Check(exc)) {
101 int i, n;
102 n = PyTuple_Size(exc);
103 for (i = 0; i < n; i++) {
104 /* Test recursively */
105 if (PyErr_GivenExceptionMatches(
106 err, PyTuple_GET_ITEM(exc, i)))
107 {
108 return 1;
109 }
110 }
111 return 0;
112 }
113 /* err might be an instance, so check its class. */
114 if (PyInstance_Check(err))
115 err = (PyObject*)((PyInstanceObject*)err)->in_class;
116
117 if (PyClass_Check(err) && PyClass_Check(exc))
118 return PyClass_IsSubclass(err, exc);
119
120 return err == exc;
121}
Guido van Rossum743007d1999-04-21 15:27:31 +0000122
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000123
124int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000126{
127 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
128}
129
130
131/* Used in many places to normalize a raised exception, including in
132 eval_code2(), do_raise(), and PyErr_Print()
133*/
134void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000136{
137 PyObject *type = *exc;
138 PyObject *value = *val;
139 PyObject *inclass = NULL;
140
Guido van Rossumed473a42000-08-07 19:18:27 +0000141 if (type == NULL) {
142 /* This is a bug. Should never happen. Don't dump core. */
143 PyErr_SetString(PyExc_SystemError,
144 "PyErr_NormalizeException() called without exception");
145 }
146
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000147 /* If PyErr_SetNone() was used, the value will have been actually
148 set to NULL.
149 */
150 if (!value) {
151 value = Py_None;
152 Py_INCREF(value);
153 }
154
155 if (PyInstance_Check(value))
156 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
157
158 /* Normalize the exception so that if the type is a class, the
159 value will be an instance.
160 */
161 if (PyClass_Check(type)) {
162 /* if the value was not an instance, or is not an instance
163 whose class is (or is derived from) type, then use the
164 value as an argument to instantiation of the type
165 class.
166 */
167 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
168 PyObject *args, *res;
169
170 if (value == Py_None)
171 args = Py_BuildValue("()");
172 else if (PyTuple_Check(value)) {
173 Py_INCREF(value);
174 args = value;
175 }
176 else
177 args = Py_BuildValue("(O)", value);
178
179 if (args == NULL)
180 goto finally;
181 res = PyEval_CallObject(type, args);
182 Py_DECREF(args);
183 if (res == NULL)
184 goto finally;
185 Py_DECREF(value);
186 value = res;
187 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000188 /* if the class of the instance doesn't exactly match the
189 class of the type, believe the instance
190 */
191 else if (inclass != type) {
192 Py_DECREF(type);
193 type = inclass;
194 Py_INCREF(type);
195 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000196 }
197 *exc = type;
198 *val = value;
199 return;
200finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000201 Py_DECREF(type);
202 Py_DECREF(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000203 Py_XDECREF(*tb);
204 PyErr_Fetch(exc, val, tb);
205 /* normalize recursively */
206 PyErr_NormalizeException(exc, val, tb);
207}
208
209
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000213 PyThreadState *tstate = PyThreadState_Get();
214
215 *p_type = tstate->curexc_type;
216 *p_value = tstate->curexc_value;
217 *p_traceback = tstate->curexc_traceback;
218
219 tstate->curexc_type = NULL;
220 tstate->curexc_value = NULL;
221 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222}
223
224void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000225PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000229
230/* Convenience functions to set a type error exception and return 0 */
231
232int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000234{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235 PyErr_SetString(PyExc_TypeError,
236 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000237 return 0;
238}
239
Guido van Rossum373c8691997-04-29 18:22:47 +0000240PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000242{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000243 if (PyErr_ExceptionMatches(PyExc_MemoryError))
244 /* already current */
245 return NULL;
246
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000247 /* raise the pre-allocated instance if it still exists */
248 if (PyExc_MemoryErrorInst)
249 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
250 else
251 /* this will probably fail since there's no memory and hee,
252 hee, we have to instantiate this class
253 */
254 PyErr_SetNone(PyExc_MemoryError);
255
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000256 return NULL;
257}
258
Guido van Rossum373c8691997-04-29 18:22:47 +0000259PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000260PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000261{
Guido van Rossum373c8691997-04-29 18:22:47 +0000262 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000263 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000264 int i = errno;
Guido van Rossum795e1892000-02-17 15:19:15 +0000265#ifdef MS_WIN32
266 char *s_buf = NULL;
267#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000268#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000269 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000270 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000271#endif
Guido van Rossume0e59821998-10-14 20:38:13 +0000272 if (i == 0)
273 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000274 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000275#ifndef MS_WIN32
Guido van Rossume0e59821998-10-14 20:38:13 +0000276 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000277#else
278 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000279 /* Note that the Win32 errors do not lineup with the
280 errno error. So if the error is in the MSVC error
281 table, we use it, otherwise we assume it really _is_
282 a Win32 error code
283 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000284 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000285 s = _sys_errlist[i];
286 }
287 else {
288 int len = FormatMessage(
289 FORMAT_MESSAGE_ALLOCATE_BUFFER |
290 FORMAT_MESSAGE_FROM_SYSTEM |
291 FORMAT_MESSAGE_IGNORE_INSERTS,
292 NULL, /* no message source */
293 i,
294 MAKELANGID(LANG_NEUTRAL,
295 SUBLANG_DEFAULT),
296 /* Default language */
297 (LPTSTR) &s_buf,
298 0, /* size not used */
299 NULL); /* no args */
300 s = s_buf;
301 /* remove trailing cr/lf and dots */
302 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
303 s[--len] = '\0';
304 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000305 }
306#endif
Barry Warsawfa5c3152000-05-02 19:27:51 +0000307 if (filename != NULL)
Guido van Rossume0e59821998-10-14 20:38:13 +0000308 v = Py_BuildValue("(iss)", i, s, filename);
309 else
310 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000311 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000312 PyErr_SetObject(exc, v);
313 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000314 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000315#ifdef MS_WIN32
Guido van Rossum795e1892000-02-17 15:19:15 +0000316 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000317#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000318 return NULL;
319}
Guido van Rossum743007d1999-04-21 15:27:31 +0000320
Barry Warsaw97d95151998-07-23 16:05:56 +0000321
322PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000323PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000324{
325 return PyErr_SetFromErrnoWithFilename(exc, NULL);
326}
Guido van Rossum683a0721990-10-21 22:09:12 +0000327
Guido van Rossum795e1892000-02-17 15:19:15 +0000328#ifdef MS_WINDOWS
329/* Windows specific error code handling */
330PyObject *PyErr_SetFromWindowsErrWithFilename(
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331 int ierr,
Guido van Rossum795e1892000-02-17 15:19:15 +0000332 const char *filename)
333{
334 int len;
335 char *s;
336 PyObject *v;
337 DWORD err = (DWORD)ierr;
338 if (err==0) err = GetLastError();
339 len = FormatMessage(
340 /* Error API error */
341 FORMAT_MESSAGE_ALLOCATE_BUFFER |
342 FORMAT_MESSAGE_FROM_SYSTEM |
343 FORMAT_MESSAGE_IGNORE_INSERTS,
344 NULL, /* no message source */
345 err,
346 MAKELANGID(LANG_NEUTRAL,
347 SUBLANG_DEFAULT), /* Default language */
348 (LPTSTR) &s,
349 0, /* size not used */
350 NULL); /* no args */
351 /* remove trailing cr/lf and dots */
352 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
353 s[--len] = '\0';
Barry Warsawfa5c3152000-05-02 19:27:51 +0000354 if (filename != NULL)
Guido van Rossum795e1892000-02-17 15:19:15 +0000355 v = Py_BuildValue("(iss)", err, s, filename);
356 else
357 v = Py_BuildValue("(is)", err, s);
358 if (v != NULL) {
Guido van Rossum0b556702000-03-02 13:55:01 +0000359 PyErr_SetObject(PyExc_WindowsError, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000360 Py_DECREF(v);
361 }
362 LocalFree(s);
363 return NULL;
364}
365
366PyObject *PyErr_SetFromWindowsErr(int ierr)
367{
368 return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
Guido van Rossum795e1892000-02-17 15:19:15 +0000369}
370#endif /* MS_WINDOWS */
371
Guido van Rossum683a0721990-10-21 22:09:12 +0000372void
Fred Drake6d63adf2000-08-24 22:38:39 +0000373_PyErr_BadInternalCall(char *filename, int lineno)
374{
375 PyErr_Format(PyExc_SystemError,
376 "%s:%d: bad argument to internal function",
377 filename, lineno);
378}
379
380/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
381 export the entry point for existing object code: */
382#undef PyErr_BadInternalCall
383void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000385{
Fred Drake6d63adf2000-08-24 22:38:39 +0000386 PyErr_Format(PyExc_SystemError,
387 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000388}
Fred Drake6d63adf2000-08-24 22:38:39 +0000389#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
390
Guido van Rossum1548bac1997-02-14 17:09:47 +0000391
392
Guido van Rossum1548bac1997-02-14 17:09:47 +0000393PyObject *
394PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000395{
396 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000397 int n, i;
398 const char* f;
399 char* s;
400 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000401
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000402 /* step 1: figure out how large a buffer we need */
403
404#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000405 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000406#else
407 va_start(vargs);
408#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000409
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000410 n = 0;
411 for (f = format; *f; f++) {
412 if (*f == '%') {
413 const char* p = f;
414 while (*++f && *f != '%' && !isalpha(*f))
415 ;
416 switch (*f) {
417 case 'c':
418 va_arg(vargs, int);
419 /* fall through... */
420 case '%':
421 n++;
422 break;
423 case 'd': case 'i': case 'x':
424 va_arg(vargs, int);
425 /* 20 bytes should be enough to hold a 64-bit
426 integer */
427 n = n + 20;
428 break;
429 case 's':
430 s = va_arg(vargs, char*);
431 n = n + strlen(s);
432 break;
433 default:
434 /* if we stumble upon an unknown
435 formatting code, copy the rest of
436 the format string to the output
437 string. (we cannot just skip the
438 code, since there's no way to know
439 what's in the argument list) */
440 n = n + strlen(p);
441 goto expand;
442 }
443 } else
444 n = n + 1;
445 }
446
447 expand:
448
449 string = PyString_FromStringAndSize(NULL, n);
450 if (!string)
451 return NULL;
452
453#ifdef HAVE_STDARG_PROTOTYPES
454 va_start(vargs, format);
455#else
456 va_start(vargs);
457#endif
458
459 /* step 2: fill the buffer */
460
461 s = PyString_AsString(string);
462
463 for (f = format; *f; f++) {
464 if (*f == '%') {
465 const char* p = f++;
466 /* parse the width.precision part (we're only
467 interested in the precision value, if any) */
468 n = 0;
469 while (isdigit(*f))
470 n = (n*10) + *f++ - '0';
471 if (*f == '.') {
472 f++;
473 n = 0;
474 while (isdigit(*f))
475 n = (n*10) + *f++ - '0';
476 }
477 while (*f && *f != '%' && !isalpha(*f))
478 f++;
479 switch (*f) {
480 case 'c':
481 *s++ = va_arg(vargs, int);
482 break;
483 case 'd':
484 sprintf(s, "%d", va_arg(vargs, int));
485 s = s + strlen(s);
486 break;
487 case 'i':
488 sprintf(s, "%i", va_arg(vargs, int));
489 s = s + strlen(s);
490 break;
491 case 'x':
492 sprintf(s, "%x", va_arg(vargs, int));
493 s = s + strlen(s);
494 break;
495 case 's':
496 p = va_arg(vargs, char*);
497 i = strlen(p);
498 if (n > 0 && i > n)
499 i = n;
500 memcpy(s, p, i);
501 s = s + i;
502 break;
503 case '%':
504 *s++ = '%';
505 break;
506 default:
507 strcpy(s, p);
508 s = s + strlen(s);
509 goto end;
510 }
511 } else
512 *s++ = *f;
513 }
514
515 end:
516
517 _PyString_Resize(&string, s - PyString_AsString(string));
518
519 PyErr_SetObject(exception, string);
520 Py_XDECREF(string);
521
Guido van Rossum1548bac1997-02-14 17:09:47 +0000522 return NULL;
523}
Guido van Rossum7617e051997-09-16 18:43:50 +0000524
525
526PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000528{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000529 char *dot;
530 PyObject *modulename = NULL;
531 PyObject *classname = NULL;
532 PyObject *mydict = NULL;
533 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000534 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000535 dot = strrchr(name, '.');
536 if (dot == NULL) {
537 PyErr_SetString(PyExc_SystemError,
538 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000539 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000540 }
541 if (base == NULL)
542 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000543 if (!PyClass_Check(base)) {
544 /* Must be using string-based standard exceptions (-X) */
545 return PyString_FromString(name);
546 }
547 if (dict == NULL) {
548 dict = mydict = PyDict_New();
549 if (dict == NULL)
550 goto failure;
551 }
552 if (PyDict_GetItemString(dict, "__module__") == NULL) {
553 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
554 if (modulename == NULL)
555 goto failure;
556 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
557 goto failure;
558 }
559 classname = PyString_FromString(dot+1);
560 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000561 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000562 bases = Py_BuildValue("(O)", base);
563 if (bases == NULL)
564 goto failure;
565 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000566 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000567 Py_XDECREF(bases);
568 Py_XDECREF(mydict);
569 Py_XDECREF(classname);
570 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000571 return result;
572}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000573
574/* Call when an exception has occurred but there is no way for Python
575 to handle it. Examples: exception in __del__ or during GC. */
576void
577PyErr_WriteUnraisable(PyObject *obj)
578{
579 PyObject *f, *t, *v, *tb;
580 PyErr_Fetch(&t, &v, &tb);
581 f = PySys_GetObject("stderr");
582 if (f != NULL) {
583 PyFile_WriteString("Exception ", f);
584 if (t) {
585 PyFile_WriteObject(t, f, Py_PRINT_RAW);
586 if (v && v != Py_None) {
587 PyFile_WriteString(": ", f);
588 PyFile_WriteObject(v, f, 0);
589 }
590 }
591 PyFile_WriteString(" in ", f);
592 PyFile_WriteObject(obj, f, 0);
593 PyFile_WriteString(" ignored\n", f);
594 PyErr_Clear(); /* Just in case */
595 }
596 Py_XDECREF(t);
597 Py_XDECREF(v);
598 Py_XDECREF(tb);
599}