blob: 5d9cab5a4c13884227269117927b98665822d76a [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);
116 /* issubclass did not succeed */
117 res = 0;
118 }
119 PyErr_Restore(exception, value, tb);
120 return res;
Brett Cannonbf364092006-03-01 04:25:17 +0000121 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000122
123 return err == exc;
124}
Guido van Rossum743007d1999-04-21 15:27:31 +0000125
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000126
127int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000128PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000129{
130 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
131}
132
133
134/* Used in many places to normalize a raised exception, including in
135 eval_code2(), do_raise(), and PyErr_Print()
136*/
137void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000138PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000139{
140 PyObject *type = *exc;
141 PyObject *value = *val;
142 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000143 PyObject *initial_tb = NULL;
Brett Cannon1e534b52007-09-07 04:18:30 +0000144 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000145
Guido van Rossumed473a42000-08-07 19:18:27 +0000146 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000147 /* There was no exception, so nothing to do. */
148 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000149 }
150
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000151 /* If PyErr_SetNone() was used, the value will have been actually
152 set to NULL.
153 */
154 if (!value) {
155 value = Py_None;
156 Py_INCREF(value);
157 }
158
Brett Cannonbf364092006-03-01 04:25:17 +0000159 if (PyExceptionInstance_Check(value))
160 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000161
162 /* Normalize the exception so that if the type is a class, the
163 value will be an instance.
164 */
Brett Cannonbf364092006-03-01 04:25:17 +0000165 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000166 /* if the value was not an instance, or is not an instance
167 whose class is (or is derived from) type, then use the
168 value as an argument to instantiation of the type
169 class.
170 */
Brett Cannonbf364092006-03-01 04:25:17 +0000171 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000172 PyObject *args, *res;
173
174 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000175 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000176 else if (PyTuple_Check(value)) {
177 Py_INCREF(value);
178 args = value;
179 }
180 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000181 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000182
183 if (args == NULL)
184 goto finally;
185 res = PyEval_CallObject(type, args);
186 Py_DECREF(args);
187 if (res == NULL)
188 goto finally;
189 Py_DECREF(value);
190 value = res;
191 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000192 /* if the class of the instance doesn't exactly match the
193 class of the type, believe the instance
194 */
195 else if (inclass != type) {
196 Py_DECREF(type);
197 type = inclass;
198 Py_INCREF(type);
199 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000200 }
201 *exc = type;
202 *val = value;
203 return;
204finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000205 Py_DECREF(type);
206 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000207 /* If the new exception doesn't set a traceback and the old
208 exception had a traceback, use the old traceback for the
209 new exception. It's better than nothing.
210 */
211 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000212 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000213 if (initial_tb != NULL) {
214 if (*tb == NULL)
215 *tb = initial_tb;
216 else
217 Py_DECREF(initial_tb);
218 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000219 /* normalize recursively */
Brett Cannon1e534b52007-09-07 04:18:30 +0000220 tstate = PyThreadState_GET();
221 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
222 --tstate->recursion_depth;
223 PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst);
224 return;
225 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000226 PyErr_NormalizeException(exc, val, tb);
Brett Cannon1e534b52007-09-07 04:18:30 +0000227 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228}
229
230
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000234 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235
236 *p_type = tstate->curexc_type;
237 *p_value = tstate->curexc_value;
238 *p_traceback = tstate->curexc_traceback;
239
240 tstate->curexc_type = NULL;
241 tstate->curexc_value = NULL;
242 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243}
244
245void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000246PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000250
251/* Convenience functions to set a type error exception and return 0 */
252
253int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000255{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000257 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000258 return 0;
259}
260
Guido van Rossum373c8691997-04-29 18:22:47 +0000261PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000262PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000263{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000264 if (PyErr_ExceptionMatches(PyExc_MemoryError))
265 /* already current */
266 return NULL;
267
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000268 /* raise the pre-allocated instance if it still exists */
269 if (PyExc_MemoryErrorInst)
270 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
271 else
272 /* this will probably fail since there's no memory and hee,
273 hee, we have to instantiate this class
274 */
275 PyErr_SetNone(PyExc_MemoryError);
276
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000277 return NULL;
278}
279
Guido van Rossum373c8691997-04-29 18:22:47 +0000280PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000281PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000282{
Guido van Rossum373c8691997-04-29 18:22:47 +0000283 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000284 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000285 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000286#ifdef PLAN9
287 char errbuf[ERRMAX];
288#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000289#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000290 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000291 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000292#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000293#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000294 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000295 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000296#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000297#ifdef PLAN9
298 rerrstr(errbuf, sizeof errbuf);
299 s = errbuf;
300#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000301 if (i == 0)
302 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000303 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000304#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000305 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000306#else
307 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000308 /* Note that the Win32 errors do not lineup with the
309 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000310 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000311 a Win32 error code
312 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000313 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000314 s = _sys_errlist[i];
315 }
316 else {
317 int len = FormatMessage(
318 FORMAT_MESSAGE_ALLOCATE_BUFFER |
319 FORMAT_MESSAGE_FROM_SYSTEM |
320 FORMAT_MESSAGE_IGNORE_INSERTS,
321 NULL, /* no message source */
322 i,
323 MAKELANGID(LANG_NEUTRAL,
324 SUBLANG_DEFAULT),
325 /* Default language */
326 (LPTSTR) &s_buf,
327 0, /* size not used */
328 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000329 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000330 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000331 situations */
332 sprintf(s_small_buf, "Windows Error 0x%X", i);
333 s = s_small_buf;
334 s_buf = NULL;
335 } else {
336 s = s_buf;
337 /* remove trailing cr/lf and dots */
338 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
339 s[--len] = '\0';
340 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000341 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000342 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000343#endif /* Unix/Windows */
344#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000345 if (filenameObject != NULL)
346 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000347 else
348 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000349 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000350 PyErr_SetObject(exc, v);
351 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000352 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000353#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000354 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000355#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000356 return NULL;
357}
Guido van Rossum743007d1999-04-21 15:27:31 +0000358
Barry Warsaw97d95151998-07-23 16:05:56 +0000359
360PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000361PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
362{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000363 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000364 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000365 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000366 return result;
367}
368
369#ifdef Py_WIN_WIDE_FILENAMES
370PyObject *
371PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
372{
Brett Cannonbf364092006-03-01 04:25:17 +0000373 PyObject *name = filename ?
374 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000375 NULL;
376 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
377 Py_XDECREF(name);
378 return result;
379}
380#endif /* Py_WIN_WIDE_FILENAMES */
381
382PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000383PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000384{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000385 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000386}
Guido van Rossum683a0721990-10-21 22:09:12 +0000387
Brett Cannonbf364092006-03-01 04:25:17 +0000388#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000389/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000390PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000391 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000392 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000393 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000394{
395 int len;
396 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000397 char *s_buf = NULL; /* Free via LocalFree */
398 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000399 PyObject *v;
400 DWORD err = (DWORD)ierr;
401 if (err==0) err = GetLastError();
402 len = FormatMessage(
403 /* Error API error */
404 FORMAT_MESSAGE_ALLOCATE_BUFFER |
405 FORMAT_MESSAGE_FROM_SYSTEM |
406 FORMAT_MESSAGE_IGNORE_INSERTS,
407 NULL, /* no message source */
408 err,
409 MAKELANGID(LANG_NEUTRAL,
410 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000411 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000412 0, /* size not used */
413 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000414 if (len==0) {
415 /* Only seen this in out of mem situations */
416 sprintf(s_small_buf, "Windows Error 0x%X", err);
417 s = s_small_buf;
418 s_buf = NULL;
419 } else {
420 s = s_buf;
421 /* remove trailing cr/lf and dots */
422 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
423 s[--len] = '\0';
424 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000425 if (filenameObject != NULL)
426 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000427 else
428 v = Py_BuildValue("(is)", err, s);
429 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000430 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000431 Py_DECREF(v);
432 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000433 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000434 return NULL;
435}
436
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000437PyObject *PyErr_SetExcFromWindowsErrWithFilename(
438 PyObject *exc,
439 int ierr,
440 const char *filename)
441{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000442 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000443 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
444 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000445 name);
446 Py_XDECREF(name);
447 return ret;
448}
449
450#ifdef Py_WIN_WIDE_FILENAMES
451PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
452 PyObject *exc,
453 int ierr,
454 const Py_UNICODE *filename)
455{
Brett Cannonbf364092006-03-01 04:25:17 +0000456 PyObject *name = filename ?
457 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000458 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000459 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
460 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000461 name);
462 Py_XDECREF(name);
463 return ret;
464}
465#endif /* Py_WIN_WIDE_FILENAMES */
466
Thomas Heller085358a2002-07-29 14:27:41 +0000467PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
468{
469 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
470}
471
Guido van Rossum795e1892000-02-17 15:19:15 +0000472PyObject *PyErr_SetFromWindowsErr(int ierr)
473{
Thomas Heller085358a2002-07-29 14:27:41 +0000474 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
475 ierr, NULL);
476}
477PyObject *PyErr_SetFromWindowsErrWithFilename(
478 int ierr,
479 const char *filename)
480{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000481 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000482 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
483 PyExc_WindowsError,
484 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000485 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000486 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000487}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000488
489#ifdef Py_WIN_WIDE_FILENAMES
490PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
491 int ierr,
492 const Py_UNICODE *filename)
493{
Brett Cannonbf364092006-03-01 04:25:17 +0000494 PyObject *name = filename ?
495 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000496 NULL;
497 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
498 PyExc_WindowsError,
499 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000500 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000501 return result;
502}
503#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000504#endif /* MS_WINDOWS */
505
Guido van Rossum683a0721990-10-21 22:09:12 +0000506void
Fred Drake6d63adf2000-08-24 22:38:39 +0000507_PyErr_BadInternalCall(char *filename, int lineno)
508{
509 PyErr_Format(PyExc_SystemError,
510 "%s:%d: bad argument to internal function",
511 filename, lineno);
512}
513
514/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
515 export the entry point for existing object code: */
516#undef PyErr_BadInternalCall
517void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000518PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000519{
Fred Drake6d63adf2000-08-24 22:38:39 +0000520 PyErr_Format(PyExc_SystemError,
521 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000522}
Fred Drake6d63adf2000-08-24 22:38:39 +0000523#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
524
Guido van Rossum1548bac1997-02-14 17:09:47 +0000525
526
Guido van Rossum1548bac1997-02-14 17:09:47 +0000527PyObject *
528PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000529{
530 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000531 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000532
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000533#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000534 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000535#else
536 va_start(vargs);
537#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000538
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000539 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000540 PyErr_SetObject(exception, string);
541 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000542 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000543 return NULL;
544}
Guido van Rossum7617e051997-09-16 18:43:50 +0000545
546
Georg Brandl658d5132006-05-23 11:17:21 +0000547
Guido van Rossum7617e051997-09-16 18:43:50 +0000548PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000549PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000550{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000551 char *dot;
552 PyObject *modulename = NULL;
553 PyObject *classname = NULL;
554 PyObject *mydict = NULL;
555 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000556 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000557 dot = strrchr(name, '.');
558 if (dot == NULL) {
559 PyErr_SetString(PyExc_SystemError,
560 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000561 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000562 }
563 if (base == NULL)
564 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000565 if (dict == NULL) {
566 dict = mydict = PyDict_New();
567 if (dict == NULL)
568 goto failure;
569 }
570 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000571 modulename = PyString_FromStringAndSize(name,
Armin Rigo7ccbca92006-10-04 12:17:45 +0000572 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000573 if (modulename == NULL)
574 goto failure;
575 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
576 goto failure;
577 }
Georg Brandl658d5132006-05-23 11:17:21 +0000578 if (PyTuple_Check(base)) {
579 bases = base;
580 /* INCREF as we create a new ref in the else branch */
581 Py_INCREF(bases);
582 } else {
583 bases = PyTuple_Pack(1, base);
584 if (bases == NULL)
585 goto failure;
586 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000587 /* Create a real new-style class. */
588 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
589 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000590 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000591 Py_XDECREF(bases);
592 Py_XDECREF(mydict);
593 Py_XDECREF(classname);
594 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000595 return result;
596}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000597
598/* Call when an exception has occurred but there is no way for Python
599 to handle it. Examples: exception in __del__ or during GC. */
600void
601PyErr_WriteUnraisable(PyObject *obj)
602{
603 PyObject *f, *t, *v, *tb;
604 PyErr_Fetch(&t, &v, &tb);
605 f = PySys_GetObject("stderr");
606 if (f != NULL) {
607 PyFile_WriteString("Exception ", f);
608 if (t) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000609 PyObject* moduleName;
Neal Norwitzf83b7512007-02-26 23:48:27 +0000610 char* className;
611 assert(PyExceptionClass_Check(t));
612 className = PyExceptionClass_Name(t);
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000613 if (className != NULL) {
614 char *dot = strrchr(className, '.');
615 if (dot != NULL)
616 className = dot+1;
617 }
618
619 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000620 if (moduleName == NULL)
621 PyFile_WriteString("<unknown>", f);
622 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000623 char* modstr = PyString_AsString(moduleName);
Neal Norwitz88516a62007-02-26 22:41:45 +0000624 if (modstr &&
625 strcmp(modstr, "exceptions") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000626 {
627 PyFile_WriteString(modstr, f);
628 PyFile_WriteString(".", f);
629 }
630 }
631 if (className == NULL)
632 PyFile_WriteString("<unknown>", f);
633 else
634 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000635 if (v && v != Py_None) {
636 PyFile_WriteString(": ", f);
637 PyFile_WriteObject(v, f, 0);
638 }
Neal Norwitz1a269202006-04-17 00:33:23 +0000639 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000640 }
641 PyFile_WriteString(" in ", f);
642 PyFile_WriteObject(obj, f, 0);
643 PyFile_WriteString(" ignored\n", f);
644 PyErr_Clear(); /* Just in case */
645 }
646 Py_XDECREF(t);
647 Py_XDECREF(v);
648 Py_XDECREF(tb);
649}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000650
Armin Rigo092381a2003-10-25 14:29:27 +0000651extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000652
Guido van Rossum2fd45652001-02-28 21:46:24 +0000653
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000654/* Set file and line information for the current exception.
655 If the exception is not a SyntaxError, also sets additional attributes
656 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000657
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000658void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000659PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000660{
661 PyObject *exc, *v, *tb, *tmp;
662
663 /* add attributes for the line number and filename for the error */
664 PyErr_Fetch(&exc, &v, &tb);
665 PyErr_NormalizeException(&exc, &v, &tb);
Richard Jones7b9558d2006-05-27 12:29:24 +0000666 /* XXX check that it is, indeed, a syntax error. It might not
667 * be, though. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000668 tmp = PyInt_FromLong(lineno);
669 if (tmp == NULL)
670 PyErr_Clear();
671 else {
672 if (PyObject_SetAttrString(v, "lineno", tmp))
673 PyErr_Clear();
674 Py_DECREF(tmp);
675 }
676 if (filename != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000677 tmp = PyString_FromString(filename);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000678 if (tmp == NULL)
679 PyErr_Clear();
680 else {
681 if (PyObject_SetAttrString(v, "filename", tmp))
682 PyErr_Clear();
683 Py_DECREF(tmp);
684 }
685
686 tmp = PyErr_ProgramText(filename, lineno);
687 if (tmp) {
Georg Brandla1121fa2006-05-29 14:13:21 +0000688 if (PyObject_SetAttrString(v, "text", tmp))
689 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000690 Py_DECREF(tmp);
691 }
692 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000693 if (PyObject_SetAttrString(v, "offset", Py_None)) {
694 PyErr_Clear();
695 }
696 if (exc != PyExc_SyntaxError) {
697 if (!PyObject_HasAttrString(v, "msg")) {
698 tmp = PyObject_Str(v);
699 if (tmp) {
700 if (PyObject_SetAttrString(v, "msg", tmp))
701 PyErr_Clear();
702 Py_DECREF(tmp);
703 } else {
704 PyErr_Clear();
705 }
706 }
707 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
708 if (PyObject_SetAttrString(v, "print_file_and_line",
709 Py_None))
710 PyErr_Clear();
711 }
712 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000713 PyErr_Restore(exc, v, tb);
714}
715
716/* com_fetch_program_text will attempt to load the line of text that
717 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000718 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000719
720 XXX The functionality of this function is quite similar to the
721 functionality in tb_displayline() in traceback.c.
722*/
723
724PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000725PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000726{
727 FILE *fp;
728 int i;
729 char linebuf[1000];
730
Tim Petersa7444f42006-02-27 23:29:46 +0000731 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000732 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000733 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000734 if (fp == NULL)
735 return NULL;
736 for (i = 0; i < lineno; i++) {
737 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
738 do {
739 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000740 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000741 break;
742 /* fgets read *something*; if it didn't get as
743 far as pLastChar, it must have found a newline
Walter Dörwaldc611f172006-05-25 08:53:28 +0000744 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000745 it obviously found a newline; else we haven't
746 yet seen a newline, so must continue */
747 } while (*pLastChar != '\0' && *pLastChar != '\n');
748 }
749 fclose(fp);
750 if (i == lineno) {
751 char *p = linebuf;
752 while (*p == ' ' || *p == '\t' || *p == '\014')
753 p++;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000754 return PyString_FromString(p);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000755 }
756 return NULL;
757}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000758
759#ifdef __cplusplus
760}
761#endif
762