blob: c88a1909c7fb86b710fe18f2327d7b6a95e99818 [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
Guido van Rossum53e8d441995-03-09 12:11:31 +00006#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +00007#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +00008extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +00009#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000010#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000011
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000012#ifdef MS_WINDOWS
Guido van Rossum743007d1999-04-21 15:27:31 +000013#include "windows.h"
14#include "winbase.h"
15#endif
16
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000017#include <ctype.h>
18
Anthony Baxterac6bd462006-04-13 02:06:09 +000019#ifdef __cplusplus
20extern "C" {
21#endif
22
23
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000025PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000026{
Guido van Rossum885553e1998-12-21 18:33:30 +000027 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000028 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Guido van Rossuma027efa1997-05-05 20:56:21 +000030 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */
Guido van Rossum1a5e21e2006-02-28 21:57:43 +000032 /* Well, it could be None. */
Guido van Rossuma027efa1997-05-05 20:56:21 +000033 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{
Gregory P. Smithdd96db62008-06-09 04:58:54 +000069 PyObject *value = PyString_FromString(string);
Guido van Rossum373c8691997-04-29 18:22:47 +000070 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)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +000092 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +000093 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. */
Brett Cannonbf364092006-03-01 04:25:17 +0000105 if (PyExceptionInstance_Check(err))
106 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000107
Brett Cannonbf364092006-03-01 04:25:17 +0000108 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
Amaury Forgeot d'Arc246daed2008-07-31 00:42:16 +0000109 int res = 0;
110 PyObject *exception, *value, *tb;
111 PyErr_Fetch(&exception, &value, &tb);
112 res = PyObject_IsSubclass(err, exc);
113 /* This function must not fail, so print the error here */
114 if (res == -1) {
115 PyErr_WriteUnraisable(err);
Amaury Forgeot d'Arc246daed2008-07-31 00:42:16 +0000116 res = 0;
117 }
118 PyErr_Restore(exception, value, tb);
119 return res;
Brett Cannonbf364092006-03-01 04:25:17 +0000120 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000121
122 return err == exc;
123}
Guido van Rossum743007d1999-04-21 15:27:31 +0000124
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000125
126int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000128{
129 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
130}
131
132
133/* Used in many places to normalize a raised exception, including in
134 eval_code2(), do_raise(), and PyErr_Print()
135*/
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000138{
139 PyObject *type = *exc;
140 PyObject *value = *val;
141 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000142 PyObject *initial_tb = NULL;
Brett Cannon1e534b52007-09-07 04:18:30 +0000143 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000144
Guido van Rossumed473a42000-08-07 19:18:27 +0000145 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000146 /* There was no exception, so nothing to do. */
147 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000148 }
149
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000150 /* If PyErr_SetNone() was used, the value will have been actually
151 set to NULL.
152 */
153 if (!value) {
154 value = Py_None;
155 Py_INCREF(value);
156 }
157
Brett Cannonbf364092006-03-01 04:25:17 +0000158 if (PyExceptionInstance_Check(value))
159 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000160
161 /* Normalize the exception so that if the type is a class, the
162 value will be an instance.
163 */
Brett Cannonbf364092006-03-01 04:25:17 +0000164 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000165 /* if the value was not an instance, or is not an instance
166 whose class is (or is derived from) type, then use the
167 value as an argument to instantiation of the type
168 class.
169 */
Brett Cannonbf364092006-03-01 04:25:17 +0000170 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000171 PyObject *args, *res;
172
173 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000174 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000175 else if (PyTuple_Check(value)) {
176 Py_INCREF(value);
177 args = value;
178 }
179 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000180 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000181
182 if (args == NULL)
183 goto finally;
184 res = PyEval_CallObject(type, args);
185 Py_DECREF(args);
186 if (res == NULL)
187 goto finally;
188 Py_DECREF(value);
189 value = res;
190 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000191 /* if the class of the instance doesn't exactly match the
192 class of the type, believe the instance
193 */
194 else if (inclass != type) {
195 Py_DECREF(type);
196 type = inclass;
197 Py_INCREF(type);
198 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000199 }
200 *exc = type;
201 *val = value;
202 return;
203finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000204 Py_DECREF(type);
205 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000206 /* If the new exception doesn't set a traceback and the old
207 exception had a traceback, use the old traceback for the
208 new exception. It's better than nothing.
209 */
210 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000211 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000212 if (initial_tb != NULL) {
213 if (*tb == NULL)
214 *tb = initial_tb;
215 else
216 Py_DECREF(initial_tb);
217 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000218 /* normalize recursively */
Brett Cannon1e534b52007-09-07 04:18:30 +0000219 tstate = PyThreadState_GET();
220 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
221 --tstate->recursion_depth;
222 PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst);
223 return;
224 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225 PyErr_NormalizeException(exc, val, tb);
Brett Cannon1e534b52007-09-07 04:18:30 +0000226 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000227}
228
229
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000231PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000233 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000234
235 *p_type = tstate->curexc_type;
236 *p_value = tstate->curexc_value;
237 *p_traceback = tstate->curexc_traceback;
238
239 tstate->curexc_type = NULL;
240 tstate->curexc_value = NULL;
241 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242}
243
244void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000249
250/* Convenience functions to set a type error exception and return 0 */
251
252int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000254{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000256 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000257 return 0;
258}
259
Guido van Rossum373c8691997-04-29 18:22:47 +0000260PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000261PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000262{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000263 if (PyErr_ExceptionMatches(PyExc_MemoryError))
264 /* already current */
265 return NULL;
266
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000267 /* raise the pre-allocated instance if it still exists */
268 if (PyExc_MemoryErrorInst)
269 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
270 else
271 /* this will probably fail since there's no memory and hee,
272 hee, we have to instantiate this class
273 */
274 PyErr_SetNone(PyExc_MemoryError);
275
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000276 return NULL;
277}
278
Guido van Rossum373c8691997-04-29 18:22:47 +0000279PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000280PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000281{
Guido van Rossum373c8691997-04-29 18:22:47 +0000282 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000283 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000284 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000285#ifdef PLAN9
286 char errbuf[ERRMAX];
287#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000288#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000289 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000290 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000291#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000292#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000293 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000294 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000295#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000296#ifdef PLAN9
297 rerrstr(errbuf, sizeof errbuf);
298 s = errbuf;
299#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000300 if (i == 0)
301 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000302 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000303#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000304 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000305#else
306 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000307 /* Note that the Win32 errors do not lineup with the
308 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000309 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000310 a Win32 error code
311 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000312 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000313 s = _sys_errlist[i];
314 }
315 else {
316 int len = FormatMessage(
317 FORMAT_MESSAGE_ALLOCATE_BUFFER |
318 FORMAT_MESSAGE_FROM_SYSTEM |
319 FORMAT_MESSAGE_IGNORE_INSERTS,
320 NULL, /* no message source */
321 i,
322 MAKELANGID(LANG_NEUTRAL,
323 SUBLANG_DEFAULT),
324 /* Default language */
325 (LPTSTR) &s_buf,
326 0, /* size not used */
327 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000328 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000329 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000330 situations */
331 sprintf(s_small_buf, "Windows Error 0x%X", i);
332 s = s_small_buf;
333 s_buf = NULL;
334 } else {
335 s = s_buf;
336 /* remove trailing cr/lf and dots */
337 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
338 s[--len] = '\0';
339 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000340 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000341 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000342#endif /* Unix/Windows */
343#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000344 if (filenameObject != NULL)
345 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000346 else
347 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000348 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000349 PyErr_SetObject(exc, v);
350 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000351 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000352#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000353 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000354#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000355 return NULL;
356}
Guido van Rossum743007d1999-04-21 15:27:31 +0000357
Barry Warsaw97d95151998-07-23 16:05:56 +0000358
359PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000360PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
361{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000362 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000363 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000364 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000365 return result;
366}
367
368#ifdef Py_WIN_WIDE_FILENAMES
369PyObject *
370PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
371{
Brett Cannonbf364092006-03-01 04:25:17 +0000372 PyObject *name = filename ?
373 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000374 NULL;
375 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
376 Py_XDECREF(name);
377 return result;
378}
379#endif /* Py_WIN_WIDE_FILENAMES */
380
381PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000383{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000384 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000385}
Guido van Rossum683a0721990-10-21 22:09:12 +0000386
Brett Cannonbf364092006-03-01 04:25:17 +0000387#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000388/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000389PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000390 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000391 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000392 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000393{
394 int len;
395 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000396 char *s_buf = NULL; /* Free via LocalFree */
397 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000398 PyObject *v;
399 DWORD err = (DWORD)ierr;
400 if (err==0) err = GetLastError();
401 len = FormatMessage(
402 /* Error API error */
403 FORMAT_MESSAGE_ALLOCATE_BUFFER |
404 FORMAT_MESSAGE_FROM_SYSTEM |
405 FORMAT_MESSAGE_IGNORE_INSERTS,
406 NULL, /* no message source */
407 err,
408 MAKELANGID(LANG_NEUTRAL,
409 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000410 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000411 0, /* size not used */
412 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000413 if (len==0) {
414 /* Only seen this in out of mem situations */
415 sprintf(s_small_buf, "Windows Error 0x%X", err);
416 s = s_small_buf;
417 s_buf = NULL;
418 } else {
419 s = s_buf;
420 /* remove trailing cr/lf and dots */
421 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
422 s[--len] = '\0';
423 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000424 if (filenameObject != NULL)
425 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000426 else
427 v = Py_BuildValue("(is)", err, s);
428 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000429 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000430 Py_DECREF(v);
431 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000432 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000433 return NULL;
434}
435
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000436PyObject *PyErr_SetExcFromWindowsErrWithFilename(
437 PyObject *exc,
438 int ierr,
439 const char *filename)
440{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000441 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000442 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
443 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000444 name);
445 Py_XDECREF(name);
446 return ret;
447}
448
449#ifdef Py_WIN_WIDE_FILENAMES
450PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
451 PyObject *exc,
452 int ierr,
453 const Py_UNICODE *filename)
454{
Brett Cannonbf364092006-03-01 04:25:17 +0000455 PyObject *name = filename ?
456 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000457 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000458 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
459 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000460 name);
461 Py_XDECREF(name);
462 return ret;
463}
464#endif /* Py_WIN_WIDE_FILENAMES */
465
Thomas Heller085358a2002-07-29 14:27:41 +0000466PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
467{
468 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
469}
470
Guido van Rossum795e1892000-02-17 15:19:15 +0000471PyObject *PyErr_SetFromWindowsErr(int ierr)
472{
Thomas Heller085358a2002-07-29 14:27:41 +0000473 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
474 ierr, NULL);
475}
476PyObject *PyErr_SetFromWindowsErrWithFilename(
477 int ierr,
478 const char *filename)
479{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000480 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000481 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
482 PyExc_WindowsError,
483 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000484 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000485 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000486}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000487
488#ifdef Py_WIN_WIDE_FILENAMES
489PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
490 int ierr,
491 const Py_UNICODE *filename)
492{
Brett Cannonbf364092006-03-01 04:25:17 +0000493 PyObject *name = filename ?
494 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000495 NULL;
496 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
497 PyExc_WindowsError,
498 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000499 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000500 return result;
501}
502#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000503#endif /* MS_WINDOWS */
504
Guido van Rossum683a0721990-10-21 22:09:12 +0000505void
Fred Drake6d63adf2000-08-24 22:38:39 +0000506_PyErr_BadInternalCall(char *filename, int lineno)
507{
508 PyErr_Format(PyExc_SystemError,
509 "%s:%d: bad argument to internal function",
510 filename, lineno);
511}
512
513/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
514 export the entry point for existing object code: */
515#undef PyErr_BadInternalCall
516void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000517PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000518{
Fred Drake6d63adf2000-08-24 22:38:39 +0000519 PyErr_Format(PyExc_SystemError,
520 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000521}
Fred Drake6d63adf2000-08-24 22:38:39 +0000522#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
523
Guido van Rossum1548bac1997-02-14 17:09:47 +0000524
525
Guido van Rossum1548bac1997-02-14 17:09:47 +0000526PyObject *
527PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000528{
529 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000530 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000531
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000532#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000533 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000534#else
535 va_start(vargs);
536#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000537
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000538 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000539 PyErr_SetObject(exception, string);
540 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000541 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000542 return NULL;
543}
Guido van Rossum7617e051997-09-16 18:43:50 +0000544
545
Georg Brandl658d5132006-05-23 11:17:21 +0000546
Guido van Rossum7617e051997-09-16 18:43:50 +0000547PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000549{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000550 char *dot;
551 PyObject *modulename = NULL;
552 PyObject *classname = NULL;
553 PyObject *mydict = NULL;
554 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000555 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000556 dot = strrchr(name, '.');
557 if (dot == NULL) {
558 PyErr_SetString(PyExc_SystemError,
559 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000560 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000561 }
562 if (base == NULL)
563 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000564 if (dict == NULL) {
565 dict = mydict = PyDict_New();
566 if (dict == NULL)
567 goto failure;
568 }
569 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000570 modulename = PyString_FromStringAndSize(name,
Armin Rigo7ccbca92006-10-04 12:17:45 +0000571 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000572 if (modulename == NULL)
573 goto failure;
574 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
575 goto failure;
576 }
Georg Brandl658d5132006-05-23 11:17:21 +0000577 if (PyTuple_Check(base)) {
578 bases = base;
579 /* INCREF as we create a new ref in the else branch */
580 Py_INCREF(bases);
581 } else {
582 bases = PyTuple_Pack(1, base);
583 if (bases == NULL)
584 goto failure;
585 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000586 /* Create a real new-style class. */
587 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
588 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000589 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000590 Py_XDECREF(bases);
591 Py_XDECREF(mydict);
592 Py_XDECREF(classname);
593 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000594 return result;
595}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000596
597/* Call when an exception has occurred but there is no way for Python
598 to handle it. Examples: exception in __del__ or during GC. */
599void
600PyErr_WriteUnraisable(PyObject *obj)
601{
602 PyObject *f, *t, *v, *tb;
603 PyErr_Fetch(&t, &v, &tb);
604 f = PySys_GetObject("stderr");
605 if (f != NULL) {
606 PyFile_WriteString("Exception ", f);
607 if (t) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000608 PyObject* moduleName;
Neal Norwitzf83b7512007-02-26 23:48:27 +0000609 char* className;
610 assert(PyExceptionClass_Check(t));
611 className = PyExceptionClass_Name(t);
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000612 if (className != NULL) {
613 char *dot = strrchr(className, '.');
614 if (dot != NULL)
615 className = dot+1;
616 }
617
618 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000619 if (moduleName == NULL)
620 PyFile_WriteString("<unknown>", f);
621 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000622 char* modstr = PyString_AsString(moduleName);
Neal Norwitz88516a62007-02-26 22:41:45 +0000623 if (modstr &&
624 strcmp(modstr, "exceptions") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000625 {
626 PyFile_WriteString(modstr, f);
627 PyFile_WriteString(".", f);
628 }
629 }
630 if (className == NULL)
631 PyFile_WriteString("<unknown>", f);
632 else
633 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000634 if (v && v != Py_None) {
635 PyFile_WriteString(": ", f);
636 PyFile_WriteObject(v, f, 0);
637 }
Neal Norwitz1a269202006-04-17 00:33:23 +0000638 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000639 }
640 PyFile_WriteString(" in ", f);
641 PyFile_WriteObject(obj, f, 0);
642 PyFile_WriteString(" ignored\n", f);
643 PyErr_Clear(); /* Just in case */
644 }
645 Py_XDECREF(t);
646 Py_XDECREF(v);
647 Py_XDECREF(tb);
648}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000649
Armin Rigo092381a2003-10-25 14:29:27 +0000650extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000651
Guido van Rossum2fd45652001-02-28 21:46:24 +0000652
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000653/* Set file and line information for the current exception.
654 If the exception is not a SyntaxError, also sets additional attributes
655 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000656
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000657void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000658PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000659{
660 PyObject *exc, *v, *tb, *tmp;
661
662 /* add attributes for the line number and filename for the error */
663 PyErr_Fetch(&exc, &v, &tb);
664 PyErr_NormalizeException(&exc, &v, &tb);
Richard Jones7b9558d2006-05-27 12:29:24 +0000665 /* XXX check that it is, indeed, a syntax error. It might not
666 * be, though. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000667 tmp = PyInt_FromLong(lineno);
668 if (tmp == NULL)
669 PyErr_Clear();
670 else {
671 if (PyObject_SetAttrString(v, "lineno", tmp))
672 PyErr_Clear();
673 Py_DECREF(tmp);
674 }
675 if (filename != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000676 tmp = PyString_FromString(filename);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000677 if (tmp == NULL)
678 PyErr_Clear();
679 else {
680 if (PyObject_SetAttrString(v, "filename", tmp))
681 PyErr_Clear();
682 Py_DECREF(tmp);
683 }
684
685 tmp = PyErr_ProgramText(filename, lineno);
686 if (tmp) {
Georg Brandla1121fa2006-05-29 14:13:21 +0000687 if (PyObject_SetAttrString(v, "text", tmp))
688 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000689 Py_DECREF(tmp);
690 }
691 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000692 if (PyObject_SetAttrString(v, "offset", Py_None)) {
693 PyErr_Clear();
694 }
695 if (exc != PyExc_SyntaxError) {
696 if (!PyObject_HasAttrString(v, "msg")) {
697 tmp = PyObject_Str(v);
698 if (tmp) {
699 if (PyObject_SetAttrString(v, "msg", tmp))
700 PyErr_Clear();
701 Py_DECREF(tmp);
702 } else {
703 PyErr_Clear();
704 }
705 }
706 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
707 if (PyObject_SetAttrString(v, "print_file_and_line",
708 Py_None))
709 PyErr_Clear();
710 }
711 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000712 PyErr_Restore(exc, v, tb);
713}
714
715/* com_fetch_program_text will attempt to load the line of text that
716 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000717 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000718
719 XXX The functionality of this function is quite similar to the
720 functionality in tb_displayline() in traceback.c.
721*/
722
723PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000724PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000725{
726 FILE *fp;
727 int i;
728 char linebuf[1000];
729
Tim Petersa7444f42006-02-27 23:29:46 +0000730 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000731 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000732 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000733 if (fp == NULL)
734 return NULL;
735 for (i = 0; i < lineno; i++) {
736 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
737 do {
738 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000739 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000740 break;
741 /* fgets read *something*; if it didn't get as
742 far as pLastChar, it must have found a newline
Walter Dörwaldc611f172006-05-25 08:53:28 +0000743 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000744 it obviously found a newline; else we haven't
745 yet seen a newline, so must continue */
746 } while (*pLastChar != '\0' && *pLastChar != '\n');
747 }
748 fclose(fp);
749 if (i == lineno) {
750 char *p = linebuf;
751 while (*p == ' ' || *p == '\t' || *p == '\014')
752 p++;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000753 return PyString_FromString(p);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000754 }
755 return NULL;
756}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000757
758#ifdef __cplusplus
759}
760#endif
761