blob: 61d1df0d75aafd515044993bc0a17ccfccb63590 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum373c8691997-04-29 18:22:47 +00002/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossum373c8691997-04-29 18:22:47 +00004#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00005
Jack Jansen8fd2d941994-12-14 12:54:54 +00006#ifdef macintosh
Tim Petersdbd9ba62000-07-09 03:09:57 +00007extern char *PyMac_StrError(int);
Jack Jansen5ef86d51995-01-19 12:16:44 +00008#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +00009#define strerror PyMac_StrError
10#endif /* macintosh */
11
Guido van Rossum53e8d441995-03-09 12:11:31 +000012#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000013#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000014extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000015#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000016#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000017
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000018#ifdef MS_WINDOWS
Guido van Rossum743007d1999-04-21 15:27:31 +000019#include "windows.h"
20#include "winbase.h"
21#endif
22
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000023#include <ctype.h>
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000026PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000027{
Guido van Rossum885553e1998-12-21 18:33:30 +000028 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000029 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000030
Guido van Rossuma027efa1997-05-05 20:56:21 +000031 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
32 /* XXX Should never happen -- fatal error instead? */
33 Py_DECREF(traceback);
34 traceback = NULL;
35 }
36
37 /* Save these in locals to safeguard against recursive
38 invocation through Py_XDECREF */
39 oldtype = tstate->curexc_type;
40 oldvalue = tstate->curexc_value;
41 oldtraceback = tstate->curexc_traceback;
42
43 tstate->curexc_type = type;
44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback;
46
47 Py_XDECREF(oldtype);
48 Py_XDECREF(oldvalue);
49 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050}
51
52void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000053PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Guido van Rossum373c8691997-04-29 18:22:47 +000055 Py_XINCREF(exception);
56 Py_XINCREF(value);
57 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058}
59
60void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000061PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062{
Guido van Rossum373c8691997-04-29 18:22:47 +000063 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064}
65
66void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000067PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068{
Guido van Rossum373c8691997-04-29 18:22:47 +000069 PyObject *value = PyString_FromString(string);
70 PyErr_SetObject(exception, value);
71 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072}
73
Guido van Rossum3a241811994-08-29 12:14:12 +000074
Guido van Rossum373c8691997-04-29 18:22:47 +000075PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000076PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077{
Tim Peters024da352001-05-30 06:09:50 +000078 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000079
80 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Barry Warsawc0dc92a1997-08-22 21:22:58 +000083
84int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000086{
Barry Warsawfa5c3152000-05-02 19:27:51 +000087 if (err == NULL || exc == NULL) {
88 /* maybe caused by "import exceptions" that failed early on */
89 return 0;
90 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000091 if (PyTuple_Check(exc)) {
92 int i, n;
93 n = PyTuple_Size(exc);
94 for (i = 0; i < n; i++) {
95 /* Test recursively */
96 if (PyErr_GivenExceptionMatches(
97 err, PyTuple_GET_ITEM(exc, i)))
98 {
99 return 1;
100 }
101 }
102 return 0;
103 }
104 /* err might be an instance, so check its class. */
105 if (PyInstance_Check(err))
106 err = (PyObject*)((PyInstanceObject*)err)->in_class;
107
108 if (PyClass_Check(err) && PyClass_Check(exc))
109 return PyClass_IsSubclass(err, exc);
110
111 return err == exc;
112}
Guido van Rossum743007d1999-04-21 15:27:31 +0000113
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000114
115int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000117{
118 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
119}
120
121
122/* Used in many places to normalize a raised exception, including in
123 eval_code2(), do_raise(), and PyErr_Print()
124*/
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000127{
128 PyObject *type = *exc;
129 PyObject *value = *val;
130 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000131 PyObject *initial_tb = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000132
Guido van Rossumed473a42000-08-07 19:18:27 +0000133 if (type == NULL) {
134 /* This is a bug. Should never happen. Don't dump core. */
135 PyErr_SetString(PyExc_SystemError,
136 "PyErr_NormalizeException() called without exception");
137 }
138
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000139 /* If PyErr_SetNone() was used, the value will have been actually
140 set to NULL.
141 */
142 if (!value) {
143 value = Py_None;
144 Py_INCREF(value);
145 }
146
147 if (PyInstance_Check(value))
148 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
149
150 /* Normalize the exception so that if the type is a class, the
151 value will be an instance.
152 */
153 if (PyClass_Check(type)) {
154 /* if the value was not an instance, or is not an instance
155 whose class is (or is derived from) type, then use the
156 value as an argument to instantiation of the type
157 class.
158 */
159 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
160 PyObject *args, *res;
161
162 if (value == Py_None)
163 args = Py_BuildValue("()");
164 else if (PyTuple_Check(value)) {
165 Py_INCREF(value);
166 args = value;
167 }
168 else
169 args = Py_BuildValue("(O)", value);
170
171 if (args == NULL)
172 goto finally;
173 res = PyEval_CallObject(type, args);
174 Py_DECREF(args);
175 if (res == NULL)
176 goto finally;
177 Py_DECREF(value);
178 value = res;
179 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000180 /* if the class of the instance doesn't exactly match the
181 class of the type, believe the instance
182 */
183 else if (inclass != type) {
184 Py_DECREF(type);
185 type = inclass;
186 Py_INCREF(type);
187 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000188 }
189 *exc = type;
190 *val = value;
191 return;
192finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000193 Py_DECREF(type);
194 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000195 /* If the new exception doesn't set a traceback and the old
196 exception had a traceback, use the old traceback for the
197 new exception. It's better than nothing.
198 */
199 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000200 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000201 if (initial_tb != NULL) {
202 if (*tb == NULL)
203 *tb = initial_tb;
204 else
205 Py_DECREF(initial_tb);
206 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000207 /* normalize recursively */
208 PyErr_NormalizeException(exc, val, tb);
209}
210
211
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000213PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000215 PyThreadState *tstate = PyThreadState_Get();
216
217 *p_type = tstate->curexc_type;
218 *p_value = tstate->curexc_value;
219 *p_traceback = tstate->curexc_traceback;
220
221 tstate->curexc_type = NULL;
222 tstate->curexc_value = NULL;
223 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224}
225
226void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000231
232/* Convenience functions to set a type error exception and return 0 */
233
234int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000235PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000236{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000238 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000239 return 0;
240}
241
Guido van Rossum373c8691997-04-29 18:22:47 +0000242PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000244{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000245 if (PyErr_ExceptionMatches(PyExc_MemoryError))
246 /* already current */
247 return NULL;
248
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000249 /* raise the pre-allocated instance if it still exists */
250 if (PyExc_MemoryErrorInst)
251 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
252 else
253 /* this will probably fail since there's no memory and hee,
254 hee, we have to instantiate this class
255 */
256 PyErr_SetNone(PyExc_MemoryError);
257
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000258 return NULL;
259}
260
Guido van Rossum373c8691997-04-29 18:22:47 +0000261PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000262PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000263{
Guido van Rossum373c8691997-04-29 18:22:47 +0000264 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000265 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000266 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000267#ifdef PLAN9
268 char errbuf[ERRMAX];
269#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000270#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000271 char *s_buf = NULL;
272#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000273#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000274 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000275 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000276#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000277#ifdef PLAN9
278 rerrstr(errbuf, sizeof errbuf);
279 s = errbuf;
280#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000281 if (i == 0)
282 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000283 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000284#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000285 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000286#else
287 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000288 /* Note that the Win32 errors do not lineup with the
289 errno error. So if the error is in the MSVC error
290 table, we use it, otherwise we assume it really _is_
291 a Win32 error code
292 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000293 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000294 s = _sys_errlist[i];
295 }
296 else {
297 int len = FormatMessage(
298 FORMAT_MESSAGE_ALLOCATE_BUFFER |
299 FORMAT_MESSAGE_FROM_SYSTEM |
300 FORMAT_MESSAGE_IGNORE_INSERTS,
301 NULL, /* no message source */
302 i,
303 MAKELANGID(LANG_NEUTRAL,
304 SUBLANG_DEFAULT),
305 /* Default language */
306 (LPTSTR) &s_buf,
307 0, /* size not used */
308 NULL); /* no args */
309 s = s_buf;
310 /* remove trailing cr/lf and dots */
311 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
312 s[--len] = '\0';
313 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000314 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000315#endif /* Unix/Windows */
316#endif /* PLAN 9*/
Barry Warsawfa5c3152000-05-02 19:27:51 +0000317 if (filename != NULL)
Guido van Rossume0e59821998-10-14 20:38:13 +0000318 v = Py_BuildValue("(iss)", i, s, filename);
319 else
320 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000321 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000322 PyErr_SetObject(exc, v);
323 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000324 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000325#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000326 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000327#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000328 return NULL;
329}
Guido van Rossum743007d1999-04-21 15:27:31 +0000330
Barry Warsaw97d95151998-07-23 16:05:56 +0000331
332PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000333PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000334{
335 return PyErr_SetFromErrnoWithFilename(exc, NULL);
336}
Guido van Rossum683a0721990-10-21 22:09:12 +0000337
Guido van Rossum795e1892000-02-17 15:19:15 +0000338#ifdef MS_WINDOWS
339/* Windows specific error code handling */
Thomas Heller085358a2002-07-29 14:27:41 +0000340PyObject *PyErr_SetExcFromWindowsErrWithFilename(
341 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000342 int ierr,
Guido van Rossum795e1892000-02-17 15:19:15 +0000343 const char *filename)
344{
345 int len;
346 char *s;
347 PyObject *v;
348 DWORD err = (DWORD)ierr;
349 if (err==0) err = GetLastError();
350 len = FormatMessage(
351 /* Error API error */
352 FORMAT_MESSAGE_ALLOCATE_BUFFER |
353 FORMAT_MESSAGE_FROM_SYSTEM |
354 FORMAT_MESSAGE_IGNORE_INSERTS,
355 NULL, /* no message source */
356 err,
357 MAKELANGID(LANG_NEUTRAL,
358 SUBLANG_DEFAULT), /* Default language */
359 (LPTSTR) &s,
360 0, /* size not used */
361 NULL); /* no args */
362 /* remove trailing cr/lf and dots */
363 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
364 s[--len] = '\0';
Barry Warsawfa5c3152000-05-02 19:27:51 +0000365 if (filename != NULL)
Guido van Rossum795e1892000-02-17 15:19:15 +0000366 v = Py_BuildValue("(iss)", err, s, filename);
367 else
368 v = Py_BuildValue("(is)", err, s);
369 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000370 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000371 Py_DECREF(v);
372 }
373 LocalFree(s);
374 return NULL;
375}
376
Thomas Heller085358a2002-07-29 14:27:41 +0000377PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
378{
379 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
380}
381
Guido van Rossum795e1892000-02-17 15:19:15 +0000382PyObject *PyErr_SetFromWindowsErr(int ierr)
383{
Thomas Heller085358a2002-07-29 14:27:41 +0000384 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
385 ierr, NULL);
386}
387PyObject *PyErr_SetFromWindowsErrWithFilename(
388 int ierr,
389 const char *filename)
390{
391 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
392 ierr, filename);
Guido van Rossum795e1892000-02-17 15:19:15 +0000393}
394#endif /* MS_WINDOWS */
395
Guido van Rossum683a0721990-10-21 22:09:12 +0000396void
Fred Drake6d63adf2000-08-24 22:38:39 +0000397_PyErr_BadInternalCall(char *filename, int lineno)
398{
399 PyErr_Format(PyExc_SystemError,
400 "%s:%d: bad argument to internal function",
401 filename, lineno);
402}
403
404/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
405 export the entry point for existing object code: */
406#undef PyErr_BadInternalCall
407void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000408PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000409{
Fred Drake6d63adf2000-08-24 22:38:39 +0000410 PyErr_Format(PyExc_SystemError,
411 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000412}
Fred Drake6d63adf2000-08-24 22:38:39 +0000413#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
414
Guido van Rossum1548bac1997-02-14 17:09:47 +0000415
416
Guido van Rossum1548bac1997-02-14 17:09:47 +0000417PyObject *
418PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000419{
420 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000421 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000422
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000423#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000424 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000425#else
426 va_start(vargs);
427#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000428
Barry Warsaw876c8cb2001-08-24 18:35:23 +0000429 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000430 PyErr_SetObject(exception, string);
431 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000432 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000433 return NULL;
434}
Guido van Rossum7617e051997-09-16 18:43:50 +0000435
436
437PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000438PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000439{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000440 char *dot;
441 PyObject *modulename = NULL;
442 PyObject *classname = NULL;
443 PyObject *mydict = NULL;
444 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000445 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000446 dot = strrchr(name, '.');
447 if (dot == NULL) {
448 PyErr_SetString(PyExc_SystemError,
449 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000450 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000451 }
452 if (base == NULL)
453 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000454 if (!PyClass_Check(base)) {
455 /* Must be using string-based standard exceptions (-X) */
456 return PyString_FromString(name);
457 }
458 if (dict == NULL) {
459 dict = mydict = PyDict_New();
460 if (dict == NULL)
461 goto failure;
462 }
463 if (PyDict_GetItemString(dict, "__module__") == NULL) {
464 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
465 if (modulename == NULL)
466 goto failure;
467 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
468 goto failure;
469 }
470 classname = PyString_FromString(dot+1);
471 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000472 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000473 bases = Py_BuildValue("(O)", base);
474 if (bases == NULL)
475 goto failure;
476 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000477 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000478 Py_XDECREF(bases);
479 Py_XDECREF(mydict);
480 Py_XDECREF(classname);
481 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000482 return result;
483}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000484
485/* Call when an exception has occurred but there is no way for Python
486 to handle it. Examples: exception in __del__ or during GC. */
487void
488PyErr_WriteUnraisable(PyObject *obj)
489{
490 PyObject *f, *t, *v, *tb;
491 PyErr_Fetch(&t, &v, &tb);
492 f = PySys_GetObject("stderr");
493 if (f != NULL) {
494 PyFile_WriteString("Exception ", f);
495 if (t) {
496 PyFile_WriteObject(t, f, Py_PRINT_RAW);
497 if (v && v != Py_None) {
498 PyFile_WriteString(": ", f);
499 PyFile_WriteObject(v, f, 0);
500 }
501 }
502 PyFile_WriteString(" in ", f);
503 PyFile_WriteObject(obj, f, 0);
504 PyFile_WriteString(" ignored\n", f);
505 PyErr_Clear(); /* Just in case */
506 }
507 Py_XDECREF(t);
508 Py_XDECREF(v);
509 Py_XDECREF(tb);
510}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000511
512
513/* Function to issue a warning message; may raise an exception. */
514int
515PyErr_Warn(PyObject *category, char *message)
516{
517 PyObject *mod, *dict, *func = NULL;
518
519 mod = PyImport_ImportModule("warnings");
520 if (mod != NULL) {
521 dict = PyModule_GetDict(mod);
522 func = PyDict_GetItemString(dict, "warn");
523 Py_DECREF(mod);
524 }
525 if (func == NULL) {
526 PySys_WriteStderr("warning: %s\n", message);
527 return 0;
528 }
529 else {
530 PyObject *args, *res;
531
532 if (category == NULL)
533 category = PyExc_RuntimeWarning;
534 args = Py_BuildValue("(sO)", message, category);
535 if (args == NULL)
536 return -1;
537 res = PyEval_CallObject(func, args);
538 Py_DECREF(args);
539 if (res == NULL)
540 return -1;
541 Py_DECREF(res);
542 return 0;
543 }
544}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000545
Guido van Rossum2fd45652001-02-28 21:46:24 +0000546
547/* Warning with explicit origin */
548int
549PyErr_WarnExplicit(PyObject *category, char *message,
550 char *filename, int lineno,
551 char *module, PyObject *registry)
552{
553 PyObject *mod, *dict, *func = NULL;
554
555 mod = PyImport_ImportModule("warnings");
556 if (mod != NULL) {
557 dict = PyModule_GetDict(mod);
558 func = PyDict_GetItemString(dict, "warn_explicit");
559 Py_DECREF(mod);
560 }
561 if (func == NULL) {
562 PySys_WriteStderr("warning: %s\n", message);
563 return 0;
564 }
565 else {
566 PyObject *args, *res;
567
568 if (category == NULL)
569 category = PyExc_RuntimeWarning;
570 if (registry == NULL)
571 registry = Py_None;
572 args = Py_BuildValue("(sOsizO)", message, category,
573 filename, lineno, module, registry);
574 if (args == NULL)
575 return -1;
576 res = PyEval_CallObject(func, args);
577 Py_DECREF(args);
578 if (res == NULL)
579 return -1;
580 Py_DECREF(res);
581 return 0;
582 }
583}
584
585
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000586/* Set file and line information for the current exception.
587 If the exception is not a SyntaxError, also sets additional attributes
588 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000589
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000590void
591PyErr_SyntaxLocation(char *filename, int lineno)
592{
593 PyObject *exc, *v, *tb, *tmp;
594
595 /* add attributes for the line number and filename for the error */
596 PyErr_Fetch(&exc, &v, &tb);
597 PyErr_NormalizeException(&exc, &v, &tb);
598 /* XXX check that it is, indeed, a syntax error */
599 tmp = PyInt_FromLong(lineno);
600 if (tmp == NULL)
601 PyErr_Clear();
602 else {
603 if (PyObject_SetAttrString(v, "lineno", tmp))
604 PyErr_Clear();
605 Py_DECREF(tmp);
606 }
607 if (filename != NULL) {
608 tmp = PyString_FromString(filename);
609 if (tmp == NULL)
610 PyErr_Clear();
611 else {
612 if (PyObject_SetAttrString(v, "filename", tmp))
613 PyErr_Clear();
614 Py_DECREF(tmp);
615 }
616
617 tmp = PyErr_ProgramText(filename, lineno);
618 if (tmp) {
619 PyObject_SetAttrString(v, "text", tmp);
620 Py_DECREF(tmp);
621 }
622 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000623 if (PyObject_SetAttrString(v, "offset", Py_None)) {
624 PyErr_Clear();
625 }
626 if (exc != PyExc_SyntaxError) {
627 if (!PyObject_HasAttrString(v, "msg")) {
628 tmp = PyObject_Str(v);
629 if (tmp) {
630 if (PyObject_SetAttrString(v, "msg", tmp))
631 PyErr_Clear();
632 Py_DECREF(tmp);
633 } else {
634 PyErr_Clear();
635 }
636 }
637 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
638 if (PyObject_SetAttrString(v, "print_file_and_line",
639 Py_None))
640 PyErr_Clear();
641 }
642 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000643 PyErr_Restore(exc, v, tb);
644}
645
646/* com_fetch_program_text will attempt to load the line of text that
647 the exception refers to. If it fails, it will return NULL but will
648 not set an exception.
649
650 XXX The functionality of this function is quite similar to the
651 functionality in tb_displayline() in traceback.c.
652*/
653
654PyObject *
655PyErr_ProgramText(char *filename, int lineno)
656{
657 FILE *fp;
658 int i;
659 char linebuf[1000];
660
661 if (filename == NULL || lineno <= 0)
662 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000663 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000664 if (fp == NULL)
665 return NULL;
666 for (i = 0; i < lineno; i++) {
667 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
668 do {
669 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000670 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000671 break;
672 /* fgets read *something*; if it didn't get as
673 far as pLastChar, it must have found a newline
674 or hit the end of the file; if pLastChar is \n,
675 it obviously found a newline; else we haven't
676 yet seen a newline, so must continue */
677 } while (*pLastChar != '\0' && *pLastChar != '\n');
678 }
679 fclose(fp);
680 if (i == lineno) {
681 char *p = linebuf;
682 while (*p == ' ' || *p == '\t' || *p == '\014')
683 p++;
684 return PyString_FromString(p);
685 }
686 return NULL;
687}