blob: 4d88d2d582c94e09734cf0c011b73dac37172a98 [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) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000134 /* There was no exception, so nothing to do. */
135 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000136 }
137
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000138 /* If PyErr_SetNone() was used, the value will have been actually
139 set to NULL.
140 */
141 if (!value) {
142 value = Py_None;
143 Py_INCREF(value);
144 }
145
146 if (PyInstance_Check(value))
147 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
148
149 /* Normalize the exception so that if the type is a class, the
150 value will be an instance.
151 */
152 if (PyClass_Check(type)) {
153 /* if the value was not an instance, or is not an instance
154 whose class is (or is derived from) type, then use the
155 value as an argument to instantiation of the type
156 class.
157 */
158 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
159 PyObject *args, *res;
160
161 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000162 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000163 else if (PyTuple_Check(value)) {
164 Py_INCREF(value);
165 args = value;
166 }
167 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000168 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000169
170 if (args == NULL)
171 goto finally;
172 res = PyEval_CallObject(type, args);
173 Py_DECREF(args);
174 if (res == NULL)
175 goto finally;
176 Py_DECREF(value);
177 value = res;
178 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000179 /* if the class of the instance doesn't exactly match the
180 class of the type, believe the instance
181 */
182 else if (inclass != type) {
183 Py_DECREF(type);
184 type = inclass;
185 Py_INCREF(type);
186 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000187 }
188 *exc = type;
189 *val = value;
190 return;
191finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000192 Py_DECREF(type);
193 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000194 /* If the new exception doesn't set a traceback and the old
195 exception had a traceback, use the old traceback for the
196 new exception. It's better than nothing.
197 */
198 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000199 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000200 if (initial_tb != NULL) {
201 if (*tb == NULL)
202 *tb = initial_tb;
203 else
204 Py_DECREF(initial_tb);
205 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000206 /* normalize recursively */
207 PyErr_NormalizeException(exc, val, tb);
208}
209
210
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000212PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000214 PyThreadState *tstate = PyThreadState_Get();
215
216 *p_type = tstate->curexc_type;
217 *p_value = tstate->curexc_value;
218 *p_traceback = tstate->curexc_traceback;
219
220 tstate->curexc_type = NULL;
221 tstate->curexc_value = NULL;
222 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223}
224
225void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000226PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000230
231/* Convenience functions to set a type error exception and return 0 */
232
233int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000234PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000235{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000236 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000237 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000238 return 0;
239}
240
Guido van Rossum373c8691997-04-29 18:22:47 +0000241PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000243{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000244 if (PyErr_ExceptionMatches(PyExc_MemoryError))
245 /* already current */
246 return NULL;
247
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000248 /* raise the pre-allocated instance if it still exists */
249 if (PyExc_MemoryErrorInst)
250 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
251 else
252 /* this will probably fail since there's no memory and hee,
253 hee, we have to instantiate this class
254 */
255 PyErr_SetNone(PyExc_MemoryError);
256
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000257 return NULL;
258}
259
Guido van Rossum373c8691997-04-29 18:22:47 +0000260PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000261PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000262{
Guido van Rossum373c8691997-04-29 18:22:47 +0000263 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000264 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000265 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000266#ifdef PLAN9
267 char errbuf[ERRMAX];
268#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000269#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000270 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000271 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000272#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 */
Mark Hammond3d61a062002-10-04 00:13:02 +0000309 if (len==0) {
310 /* Only ever seen this in out-of-mem
311 situations */
312 sprintf(s_small_buf, "Windows Error 0x%X", i);
313 s = s_small_buf;
314 s_buf = NULL;
315 } else {
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 Rossum795e1892000-02-17 15:19:15 +0000321 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000322 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000323#endif /* Unix/Windows */
324#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000325 if (filenameObject != NULL)
326 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000327 else
328 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000329 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000330 PyErr_SetObject(exc, v);
331 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000332 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000333#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000334 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000335#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000336 return NULL;
337}
Guido van Rossum743007d1999-04-21 15:27:31 +0000338
Barry Warsaw97d95151998-07-23 16:05:56 +0000339
340PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000341PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
342{
343 PyObject *name = filename ? PyString_FromString(filename) : NULL;
344 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000345 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000346 return result;
347}
348
349#ifdef Py_WIN_WIDE_FILENAMES
350PyObject *
351PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
352{
353 PyObject *name = filename ?
354 PyUnicode_FromUnicode(filename, wcslen(filename)) :
355 NULL;
356 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
357 Py_XDECREF(name);
358 return result;
359}
360#endif /* Py_WIN_WIDE_FILENAMES */
361
362PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000363PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000364{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000365 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000366}
Guido van Rossum683a0721990-10-21 22:09:12 +0000367
Guido van Rossum795e1892000-02-17 15:19:15 +0000368#ifdef MS_WINDOWS
369/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000370PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000371 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000372 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000373 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000374{
375 int len;
376 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000377 char *s_buf = NULL; /* Free via LocalFree */
378 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000379 PyObject *v;
380 DWORD err = (DWORD)ierr;
381 if (err==0) err = GetLastError();
382 len = FormatMessage(
383 /* Error API error */
384 FORMAT_MESSAGE_ALLOCATE_BUFFER |
385 FORMAT_MESSAGE_FROM_SYSTEM |
386 FORMAT_MESSAGE_IGNORE_INSERTS,
387 NULL, /* no message source */
388 err,
389 MAKELANGID(LANG_NEUTRAL,
390 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000391 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000392 0, /* size not used */
393 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000394 if (len==0) {
395 /* Only seen this in out of mem situations */
396 sprintf(s_small_buf, "Windows Error 0x%X", err);
397 s = s_small_buf;
398 s_buf = NULL;
399 } else {
400 s = s_buf;
401 /* remove trailing cr/lf and dots */
402 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
403 s[--len] = '\0';
404 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000405 if (filenameObject != NULL)
406 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000407 else
408 v = Py_BuildValue("(is)", err, s);
409 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000410 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000411 Py_DECREF(v);
412 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000413 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000414 return NULL;
415}
416
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000417PyObject *PyErr_SetExcFromWindowsErrWithFilename(
418 PyObject *exc,
419 int ierr,
420 const char *filename)
421{
422 PyObject *name = filename ? PyString_FromString(filename) : NULL;
423 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
424 ierr,
425 name);
426 Py_XDECREF(name);
427 return ret;
428}
429
430#ifdef Py_WIN_WIDE_FILENAMES
431PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
432 PyObject *exc,
433 int ierr,
434 const Py_UNICODE *filename)
435{
436 PyObject *name = filename ?
437 PyUnicode_FromUnicode(filename, wcslen(filename)) :
438 NULL;
439 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
440 ierr,
441 name);
442 Py_XDECREF(name);
443 return ret;
444}
445#endif /* Py_WIN_WIDE_FILENAMES */
446
Thomas Heller085358a2002-07-29 14:27:41 +0000447PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
448{
449 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
450}
451
Guido van Rossum795e1892000-02-17 15:19:15 +0000452PyObject *PyErr_SetFromWindowsErr(int ierr)
453{
Thomas Heller085358a2002-07-29 14:27:41 +0000454 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
455 ierr, NULL);
456}
457PyObject *PyErr_SetFromWindowsErrWithFilename(
458 int ierr,
459 const char *filename)
460{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000461 PyObject *name = filename ? PyString_FromString(filename) : NULL;
462 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
463 PyExc_WindowsError,
464 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000465 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000466 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000467}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000468
469#ifdef Py_WIN_WIDE_FILENAMES
470PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
471 int ierr,
472 const Py_UNICODE *filename)
473{
474 PyObject *name = filename ?
475 PyUnicode_FromUnicode(filename, wcslen(filename)) :
476 NULL;
477 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
478 PyExc_WindowsError,
479 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000480 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000481 return result;
482}
483#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000484#endif /* MS_WINDOWS */
485
Guido van Rossum683a0721990-10-21 22:09:12 +0000486void
Fred Drake6d63adf2000-08-24 22:38:39 +0000487_PyErr_BadInternalCall(char *filename, int lineno)
488{
489 PyErr_Format(PyExc_SystemError,
490 "%s:%d: bad argument to internal function",
491 filename, lineno);
492}
493
494/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
495 export the entry point for existing object code: */
496#undef PyErr_BadInternalCall
497void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000499{
Fred Drake6d63adf2000-08-24 22:38:39 +0000500 PyErr_Format(PyExc_SystemError,
501 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000502}
Fred Drake6d63adf2000-08-24 22:38:39 +0000503#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
504
Guido van Rossum1548bac1997-02-14 17:09:47 +0000505
506
Guido van Rossum1548bac1997-02-14 17:09:47 +0000507PyObject *
508PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000509{
510 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000511 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000512
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000513#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000514 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000515#else
516 va_start(vargs);
517#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000518
Barry Warsaw876c8cb2001-08-24 18:35:23 +0000519 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000520 PyErr_SetObject(exception, string);
521 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000522 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000523 return NULL;
524}
Guido van Rossum7617e051997-09-16 18:43:50 +0000525
526
527PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000529{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000530 char *dot;
531 PyObject *modulename = NULL;
532 PyObject *classname = NULL;
533 PyObject *mydict = NULL;
534 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000535 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000536 dot = strrchr(name, '.');
537 if (dot == NULL) {
538 PyErr_SetString(PyExc_SystemError,
539 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000540 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000541 }
542 if (base == NULL)
543 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000544 if (!PyClass_Check(base)) {
545 /* Must be using string-based standard exceptions (-X) */
546 return PyString_FromString(name);
547 }
548 if (dict == NULL) {
549 dict = mydict = PyDict_New();
550 if (dict == NULL)
551 goto failure;
552 }
553 if (PyDict_GetItemString(dict, "__module__") == NULL) {
554 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
555 if (modulename == NULL)
556 goto failure;
557 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
558 goto failure;
559 }
560 classname = PyString_FromString(dot+1);
561 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000562 goto failure;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000563 bases = PyTuple_Pack(1, base);
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000564 if (bases == NULL)
565 goto failure;
566 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000567 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000568 Py_XDECREF(bases);
569 Py_XDECREF(mydict);
570 Py_XDECREF(classname);
571 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000572 return result;
573}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000574
575/* Call when an exception has occurred but there is no way for Python
576 to handle it. Examples: exception in __del__ or during GC. */
577void
578PyErr_WriteUnraisable(PyObject *obj)
579{
580 PyObject *f, *t, *v, *tb;
581 PyErr_Fetch(&t, &v, &tb);
582 f = PySys_GetObject("stderr");
583 if (f != NULL) {
584 PyFile_WriteString("Exception ", f);
585 if (t) {
586 PyFile_WriteObject(t, f, Py_PRINT_RAW);
587 if (v && v != Py_None) {
588 PyFile_WriteString(": ", f);
589 PyFile_WriteObject(v, f, 0);
590 }
591 }
592 PyFile_WriteString(" in ", f);
593 PyFile_WriteObject(obj, f, 0);
594 PyFile_WriteString(" ignored\n", f);
595 PyErr_Clear(); /* Just in case */
596 }
597 Py_XDECREF(t);
598 Py_XDECREF(v);
599 Py_XDECREF(tb);
600}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000601
Armin Rigo092381a2003-10-25 14:29:27 +0000602extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000603
604/* Function to issue a warning message; may raise an exception. */
605int
606PyErr_Warn(PyObject *category, char *message)
607{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000608 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000609 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000610
Mark Hammondedd07732003-07-15 23:03:55 +0000611 if (warnings_module != NULL) {
612 dict = PyModule_GetDict(warnings_module);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000613 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000614 }
615 if (func == NULL) {
616 PySys_WriteStderr("warning: %s\n", message);
617 return 0;
618 }
619 else {
620 PyObject *args, *res;
621
622 if (category == NULL)
623 category = PyExc_RuntimeWarning;
624 args = Py_BuildValue("(sO)", message, category);
625 if (args == NULL)
626 return -1;
627 res = PyEval_CallObject(func, args);
628 Py_DECREF(args);
629 if (res == NULL)
630 return -1;
631 Py_DECREF(res);
632 return 0;
633 }
634}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000635
Guido van Rossum2fd45652001-02-28 21:46:24 +0000636
637/* Warning with explicit origin */
638int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000639PyErr_WarnExplicit(PyObject *category, const char *message,
640 const char *filename, int lineno,
641 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000642{
643 PyObject *mod, *dict, *func = NULL;
644
645 mod = PyImport_ImportModule("warnings");
646 if (mod != NULL) {
647 dict = PyModule_GetDict(mod);
648 func = PyDict_GetItemString(dict, "warn_explicit");
649 Py_DECREF(mod);
650 }
651 if (func == NULL) {
652 PySys_WriteStderr("warning: %s\n", message);
653 return 0;
654 }
655 else {
656 PyObject *args, *res;
657
658 if (category == NULL)
659 category = PyExc_RuntimeWarning;
660 if (registry == NULL)
661 registry = Py_None;
662 args = Py_BuildValue("(sOsizO)", message, category,
663 filename, lineno, module, registry);
664 if (args == NULL)
665 return -1;
666 res = PyEval_CallObject(func, args);
667 Py_DECREF(args);
668 if (res == NULL)
669 return -1;
670 Py_DECREF(res);
671 return 0;
672 }
673}
674
675
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000676/* Set file and line information for the current exception.
677 If the exception is not a SyntaxError, also sets additional attributes
678 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000679
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000680void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000681PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000682{
683 PyObject *exc, *v, *tb, *tmp;
684
685 /* add attributes for the line number and filename for the error */
686 PyErr_Fetch(&exc, &v, &tb);
687 PyErr_NormalizeException(&exc, &v, &tb);
688 /* XXX check that it is, indeed, a syntax error */
689 tmp = PyInt_FromLong(lineno);
690 if (tmp == NULL)
691 PyErr_Clear();
692 else {
693 if (PyObject_SetAttrString(v, "lineno", tmp))
694 PyErr_Clear();
695 Py_DECREF(tmp);
696 }
697 if (filename != NULL) {
698 tmp = PyString_FromString(filename);
699 if (tmp == NULL)
700 PyErr_Clear();
701 else {
702 if (PyObject_SetAttrString(v, "filename", tmp))
703 PyErr_Clear();
704 Py_DECREF(tmp);
705 }
706
707 tmp = PyErr_ProgramText(filename, lineno);
708 if (tmp) {
709 PyObject_SetAttrString(v, "text", tmp);
710 Py_DECREF(tmp);
711 }
712 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000713 if (PyObject_SetAttrString(v, "offset", Py_None)) {
714 PyErr_Clear();
715 }
716 if (exc != PyExc_SyntaxError) {
717 if (!PyObject_HasAttrString(v, "msg")) {
718 tmp = PyObject_Str(v);
719 if (tmp) {
720 if (PyObject_SetAttrString(v, "msg", tmp))
721 PyErr_Clear();
722 Py_DECREF(tmp);
723 } else {
724 PyErr_Clear();
725 }
726 }
727 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
728 if (PyObject_SetAttrString(v, "print_file_and_line",
729 Py_None))
730 PyErr_Clear();
731 }
732 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000733 PyErr_Restore(exc, v, tb);
734}
735
736/* com_fetch_program_text will attempt to load the line of text that
737 the exception refers to. If it fails, it will return NULL but will
738 not set an exception.
739
740 XXX The functionality of this function is quite similar to the
741 functionality in tb_displayline() in traceback.c.
742*/
743
744PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000745PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000746{
747 FILE *fp;
748 int i;
749 char linebuf[1000];
750
751 if (filename == NULL || lineno <= 0)
752 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000753 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000754 if (fp == NULL)
755 return NULL;
756 for (i = 0; i < lineno; i++) {
757 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
758 do {
759 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000760 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000761 break;
762 /* fgets read *something*; if it didn't get as
763 far as pLastChar, it must have found a newline
764 or hit the end of the file; if pLastChar is \n,
765 it obviously found a newline; else we haven't
766 yet seen a newline, so must continue */
767 } while (*pLastChar != '\0' && *pLastChar != '\n');
768 }
769 fclose(fp);
770 if (i == lineno) {
771 char *p = linebuf;
772 while (*p == ' ' || *p == '\t' || *p == '\014')
773 p++;
774 return PyString_FromString(p);
775 }
776 return NULL;
777}