blob: 67f86ed36c2b610d80090b85e3f9dd7d9513008b [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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000020PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000021{
Guido van Rossum885553e1998-12-21 18:33:30 +000022 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000023 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024
Guido van Rossuma027efa1997-05-05 20:56:21 +000025 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
26 /* XXX Should never happen -- fatal error instead? */
Guido van Rossum1a5e21e2006-02-28 21:57:43 +000027 /* Well, it could be None. */
Guido van Rossuma027efa1997-05-05 20:56:21 +000028 Py_DECREF(traceback);
29 traceback = NULL;
30 }
31
32 /* Save these in locals to safeguard against recursive
33 invocation through Py_XDECREF */
34 oldtype = tstate->curexc_type;
35 oldvalue = tstate->curexc_value;
36 oldtraceback = tstate->curexc_traceback;
37
38 tstate->curexc_type = type;
39 tstate->curexc_value = value;
40 tstate->curexc_traceback = traceback;
41
42 Py_XDECREF(oldtype);
43 Py_XDECREF(oldvalue);
44 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045}
46
47void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000048PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
Thomas Wouters303de6a2006-04-20 22:42:37 +000050 if (exception != NULL &&
51 !PyExceptionClass_Check(exception)) {
52 PyObject *excstr = PyObject_Repr(exception);
53 PyErr_Format(PyExc_SystemError,
54 "exception %s not a BaseException subclass",
55 PyString_AS_STRING(excstr));
56 Py_DECREF(excstr);
57 return;
58 }
Guido van Rossum373c8691997-04-29 18:22:47 +000059 Py_XINCREF(exception);
60 Py_XINCREF(value);
61 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062}
63
64void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000065PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066{
Guido van Rossum373c8691997-04-29 18:22:47 +000067 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068}
69
70void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000071PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072{
Guido van Rossum373c8691997-04-29 18:22:47 +000073 PyObject *value = PyString_FromString(string);
74 PyErr_SetObject(exception, value);
75 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076}
77
Guido van Rossum3a241811994-08-29 12:14:12 +000078
Guido van Rossum373c8691997-04-29 18:22:47 +000079PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Tim Peters024da352001-05-30 06:09:50 +000082 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000083
84 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085}
86
Barry Warsawc0dc92a1997-08-22 21:22:58 +000087
88int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000089PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000090{
Barry Warsawfa5c3152000-05-02 19:27:51 +000091 if (err == NULL || exc == NULL) {
92 /* maybe caused by "import exceptions" that failed early on */
93 return 0;
94 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000095 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +000096 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +000097 n = PyTuple_Size(exc);
98 for (i = 0; i < n; i++) {
99 /* Test recursively */
100 if (PyErr_GivenExceptionMatches(
101 err, PyTuple_GET_ITEM(exc, i)))
102 {
103 return 1;
104 }
105 }
106 return 0;
107 }
108 /* err might be an instance, so check its class. */
Brett Cannonbf364092006-03-01 04:25:17 +0000109 if (PyExceptionInstance_Check(err))
110 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000111
Brett Cannonbf364092006-03-01 04:25:17 +0000112 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
113 /* problems here!? not sure PyObject_IsSubclass expects to
114 be called with an exception pending... */
115 return PyObject_IsSubclass(err, exc);
116 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000117
118 return err == exc;
119}
Guido van Rossum743007d1999-04-21 15:27:31 +0000120
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000121
122int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000123PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000124{
125 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
126}
127
128
129/* Used in many places to normalize a raised exception, including in
130 eval_code2(), do_raise(), and PyErr_Print()
131*/
132void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000134{
135 PyObject *type = *exc;
136 PyObject *value = *val;
137 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000138 PyObject *initial_tb = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000139
Guido van Rossumed473a42000-08-07 19:18:27 +0000140 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000141 /* There was no exception, so nothing to do. */
142 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000143 }
144
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000145 /* If PyErr_SetNone() was used, the value will have been actually
146 set to NULL.
147 */
148 if (!value) {
149 value = Py_None;
150 Py_INCREF(value);
151 }
152
Brett Cannonbf364092006-03-01 04:25:17 +0000153 if (PyExceptionInstance_Check(value))
154 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000155
156 /* Normalize the exception so that if the type is a class, the
157 value will be an instance.
158 */
Brett Cannonbf364092006-03-01 04:25:17 +0000159 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000160 /* if the value was not an instance, or is not an instance
161 whose class is (or is derived from) type, then use the
162 value as an argument to instantiation of the type
163 class.
164 */
Brett Cannonbf364092006-03-01 04:25:17 +0000165 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000166 PyObject *args, *res;
167
168 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000169 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000170 else if (PyTuple_Check(value)) {
171 Py_INCREF(value);
172 args = value;
173 }
174 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000175 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000176
177 if (args == NULL)
178 goto finally;
179 res = PyEval_CallObject(type, args);
180 Py_DECREF(args);
181 if (res == NULL)
182 goto finally;
183 Py_DECREF(value);
184 value = res;
185 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000186 /* if the class of the instance doesn't exactly match the
187 class of the type, believe the instance
188 */
189 else if (inclass != type) {
190 Py_DECREF(type);
191 type = inclass;
192 Py_INCREF(type);
193 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000194 }
195 *exc = type;
196 *val = value;
197 return;
198finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000199 Py_DECREF(type);
200 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000201 /* If the new exception doesn't set a traceback and the old
202 exception had a traceback, use the old traceback for the
203 new exception. It's better than nothing.
204 */
205 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000206 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000207 if (initial_tb != NULL) {
208 if (*tb == NULL)
209 *tb = initial_tb;
210 else
211 Py_DECREF(initial_tb);
212 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000213 /* normalize recursively */
214 PyErr_NormalizeException(exc, val, tb);
215}
216
217
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000221 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000222
223 *p_type = tstate->curexc_type;
224 *p_value = tstate->curexc_value;
225 *p_traceback = tstate->curexc_traceback;
226
227 tstate->curexc_type = NULL;
228 tstate->curexc_value = NULL;
229 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230}
231
232void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000235 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000237
238/* Convenience functions to set a type error exception and return 0 */
239
240int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000242{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000244 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000245 return 0;
246}
247
Guido van Rossum373c8691997-04-29 18:22:47 +0000248PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000250{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000251 if (PyErr_ExceptionMatches(PyExc_MemoryError))
252 /* already current */
253 return NULL;
254
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000255 /* raise the pre-allocated instance if it still exists */
256 if (PyExc_MemoryErrorInst)
257 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
258 else
259 /* this will probably fail since there's no memory and hee,
260 hee, we have to instantiate this class
261 */
262 PyErr_SetNone(PyExc_MemoryError);
263
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000264 return NULL;
265}
266
Guido van Rossum373c8691997-04-29 18:22:47 +0000267PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000268PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000269{
Guido van Rossum373c8691997-04-29 18:22:47 +0000270 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000271 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000272 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000273#ifdef PLAN9
274 char errbuf[ERRMAX];
275#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000276#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000277 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000278 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000279#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000280#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000281 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000282 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000283#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000284#ifdef PLAN9
285 rerrstr(errbuf, sizeof errbuf);
286 s = errbuf;
287#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000288 if (i == 0)
289 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000290 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000291#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000292 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000293#else
294 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000295 /* Note that the Win32 errors do not lineup with the
296 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000297 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000298 a Win32 error code
299 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000300 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000301 s = _sys_errlist[i];
302 }
303 else {
304 int len = FormatMessage(
305 FORMAT_MESSAGE_ALLOCATE_BUFFER |
306 FORMAT_MESSAGE_FROM_SYSTEM |
307 FORMAT_MESSAGE_IGNORE_INSERTS,
308 NULL, /* no message source */
309 i,
310 MAKELANGID(LANG_NEUTRAL,
311 SUBLANG_DEFAULT),
312 /* Default language */
313 (LPTSTR) &s_buf,
314 0, /* size not used */
315 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000316 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000317 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000318 situations */
319 sprintf(s_small_buf, "Windows Error 0x%X", i);
320 s = s_small_buf;
321 s_buf = NULL;
322 } else {
323 s = s_buf;
324 /* remove trailing cr/lf and dots */
325 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
326 s[--len] = '\0';
327 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000328 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000329 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000330#endif /* Unix/Windows */
331#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000332 if (filenameObject != NULL)
333 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000334 else
335 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000336 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000337 PyErr_SetObject(exc, v);
338 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000339 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000340#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000341 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000342#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000343 return NULL;
344}
Guido van Rossum743007d1999-04-21 15:27:31 +0000345
Barry Warsaw97d95151998-07-23 16:05:56 +0000346
347PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000348PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
349{
350 PyObject *name = filename ? PyString_FromString(filename) : NULL;
351 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000352 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000353 return result;
354}
355
356#ifdef Py_WIN_WIDE_FILENAMES
357PyObject *
358PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
359{
Brett Cannonbf364092006-03-01 04:25:17 +0000360 PyObject *name = filename ?
361 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000362 NULL;
363 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
364 Py_XDECREF(name);
365 return result;
366}
367#endif /* Py_WIN_WIDE_FILENAMES */
368
369PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000370PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000371{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000372 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000373}
Guido van Rossum683a0721990-10-21 22:09:12 +0000374
Brett Cannonbf364092006-03-01 04:25:17 +0000375#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000376/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000377PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000378 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000379 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000380 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000381{
382 int len;
383 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000384 char *s_buf = NULL; /* Free via LocalFree */
385 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000386 PyObject *v;
387 DWORD err = (DWORD)ierr;
388 if (err==0) err = GetLastError();
389 len = FormatMessage(
390 /* Error API error */
391 FORMAT_MESSAGE_ALLOCATE_BUFFER |
392 FORMAT_MESSAGE_FROM_SYSTEM |
393 FORMAT_MESSAGE_IGNORE_INSERTS,
394 NULL, /* no message source */
395 err,
396 MAKELANGID(LANG_NEUTRAL,
397 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000398 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000399 0, /* size not used */
400 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000401 if (len==0) {
402 /* Only seen this in out of mem situations */
403 sprintf(s_small_buf, "Windows Error 0x%X", err);
404 s = s_small_buf;
405 s_buf = NULL;
406 } else {
407 s = s_buf;
408 /* remove trailing cr/lf and dots */
409 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
410 s[--len] = '\0';
411 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000412 if (filenameObject != NULL)
413 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000414 else
415 v = Py_BuildValue("(is)", err, s);
416 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000417 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000418 Py_DECREF(v);
419 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000420 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000421 return NULL;
422}
423
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000424PyObject *PyErr_SetExcFromWindowsErrWithFilename(
425 PyObject *exc,
426 int ierr,
427 const char *filename)
428{
429 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000430 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
431 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000432 name);
433 Py_XDECREF(name);
434 return ret;
435}
436
437#ifdef Py_WIN_WIDE_FILENAMES
438PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
439 PyObject *exc,
440 int ierr,
441 const Py_UNICODE *filename)
442{
Brett Cannonbf364092006-03-01 04:25:17 +0000443 PyObject *name = filename ?
444 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000445 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000446 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
447 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000448 name);
449 Py_XDECREF(name);
450 return ret;
451}
452#endif /* Py_WIN_WIDE_FILENAMES */
453
Thomas Heller085358a2002-07-29 14:27:41 +0000454PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
455{
456 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
457}
458
Guido van Rossum795e1892000-02-17 15:19:15 +0000459PyObject *PyErr_SetFromWindowsErr(int ierr)
460{
Thomas Heller085358a2002-07-29 14:27:41 +0000461 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
462 ierr, NULL);
463}
464PyObject *PyErr_SetFromWindowsErrWithFilename(
465 int ierr,
466 const char *filename)
467{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000468 PyObject *name = filename ? PyString_FromString(filename) : NULL;
469 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
470 PyExc_WindowsError,
471 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000472 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000473 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000474}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000475
476#ifdef Py_WIN_WIDE_FILENAMES
477PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
478 int ierr,
479 const Py_UNICODE *filename)
480{
Brett Cannonbf364092006-03-01 04:25:17 +0000481 PyObject *name = filename ?
482 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000483 NULL;
484 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
485 PyExc_WindowsError,
486 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000487 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000488 return result;
489}
490#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000491#endif /* MS_WINDOWS */
492
Guido van Rossum683a0721990-10-21 22:09:12 +0000493void
Fred Drake6d63adf2000-08-24 22:38:39 +0000494_PyErr_BadInternalCall(char *filename, int lineno)
495{
496 PyErr_Format(PyExc_SystemError,
497 "%s:%d: bad argument to internal function",
498 filename, lineno);
499}
500
501/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
502 export the entry point for existing object code: */
503#undef PyErr_BadInternalCall
504void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000505PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000506{
Fred Drake6d63adf2000-08-24 22:38:39 +0000507 PyErr_Format(PyExc_SystemError,
508 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000509}
Fred Drake6d63adf2000-08-24 22:38:39 +0000510#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
511
Guido van Rossum1548bac1997-02-14 17:09:47 +0000512
513
Guido van Rossum1548bac1997-02-14 17:09:47 +0000514PyObject *
515PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000516{
517 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000518 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000519
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000520#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000521 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000522#else
523 va_start(vargs);
524#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000525
Barry Warsaw876c8cb2001-08-24 18:35:23 +0000526 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000527 PyErr_SetObject(exception, string);
528 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000529 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000530 return NULL;
531}
Guido van Rossum7617e051997-09-16 18:43:50 +0000532
533
534PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000535PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000536{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000537 char *dot;
538 PyObject *modulename = NULL;
539 PyObject *classname = NULL;
540 PyObject *mydict = NULL;
541 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000542 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000543 dot = strrchr(name, '.');
544 if (dot == NULL) {
545 PyErr_SetString(PyExc_SystemError,
546 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000547 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000548 }
549 if (base == NULL)
550 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000551 if (dict == NULL) {
552 dict = mydict = PyDict_New();
553 if (dict == NULL)
554 goto failure;
555 }
556 if (PyDict_GetItemString(dict, "__module__") == NULL) {
557 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
558 if (modulename == NULL)
559 goto failure;
560 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
561 goto failure;
562 }
563 classname = PyString_FromString(dot+1);
564 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000565 goto failure;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000566 bases = PyTuple_Pack(1, base);
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000567 if (bases == NULL)
568 goto failure;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000569 result = PyObject_CallFunction((PyObject *) (base->ob_type),
570 "OOO", classname, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000571 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000572 Py_XDECREF(bases);
573 Py_XDECREF(mydict);
574 Py_XDECREF(classname);
575 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000576 return result;
577}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000578
579/* Call when an exception has occurred but there is no way for Python
580 to handle it. Examples: exception in __del__ or during GC. */
581void
582PyErr_WriteUnraisable(PyObject *obj)
583{
584 PyObject *f, *t, *v, *tb;
585 PyErr_Fetch(&t, &v, &tb);
586 f = PySys_GetObject("stderr");
587 if (f != NULL) {
588 PyFile_WriteString("Exception ", f);
589 if (t) {
Brett Cannonbf364092006-03-01 04:25:17 +0000590 char* className = PyExceptionClass_Name(t);
591 PyObject* moduleName =
592 PyObject_GetAttrString(t, "__module__");
593
594 if (moduleName == NULL)
595 PyFile_WriteString("<unknown>", f);
596 else {
597 char* modstr = PyString_AsString(moduleName);
598 if (modstr)
599 {
600 PyFile_WriteString(modstr, f);
601 PyFile_WriteString(".", f);
602 }
603 }
604 if (className == NULL)
605 PyFile_WriteString("<unknown>", f);
606 else
607 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000608 if (v && v != Py_None) {
609 PyFile_WriteString(": ", f);
610 PyFile_WriteObject(v, f, 0);
611 }
612 }
613 PyFile_WriteString(" in ", f);
614 PyFile_WriteObject(obj, f, 0);
615 PyFile_WriteString(" ignored\n", f);
616 PyErr_Clear(); /* Just in case */
617 }
618 Py_XDECREF(t);
619 Py_XDECREF(v);
620 Py_XDECREF(tb);
621}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000622
Armin Rigo092381a2003-10-25 14:29:27 +0000623extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000624
625/* Function to issue a warning message; may raise an exception. */
626int
627PyErr_Warn(PyObject *category, char *message)
628{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000629 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000630 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000631
Mark Hammondedd07732003-07-15 23:03:55 +0000632 if (warnings_module != NULL) {
633 dict = PyModule_GetDict(warnings_module);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000634 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000635 }
636 if (func == NULL) {
637 PySys_WriteStderr("warning: %s\n", message);
638 return 0;
639 }
640 else {
641 PyObject *args, *res;
642
643 if (category == NULL)
644 category = PyExc_RuntimeWarning;
645 args = Py_BuildValue("(sO)", message, category);
646 if (args == NULL)
647 return -1;
648 res = PyEval_CallObject(func, args);
649 Py_DECREF(args);
650 if (res == NULL)
651 return -1;
652 Py_DECREF(res);
653 return 0;
654 }
655}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000656
Guido van Rossum2fd45652001-02-28 21:46:24 +0000657
658/* Warning with explicit origin */
659int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000660PyErr_WarnExplicit(PyObject *category, const char *message,
661 const char *filename, int lineno,
662 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000663{
664 PyObject *mod, *dict, *func = NULL;
665
666 mod = PyImport_ImportModule("warnings");
667 if (mod != NULL) {
668 dict = PyModule_GetDict(mod);
669 func = PyDict_GetItemString(dict, "warn_explicit");
670 Py_DECREF(mod);
671 }
672 if (func == NULL) {
673 PySys_WriteStderr("warning: %s\n", message);
674 return 0;
675 }
676 else {
677 PyObject *args, *res;
678
679 if (category == NULL)
680 category = PyExc_RuntimeWarning;
681 if (registry == NULL)
682 registry = Py_None;
683 args = Py_BuildValue("(sOsizO)", message, category,
684 filename, lineno, module, registry);
685 if (args == NULL)
686 return -1;
687 res = PyEval_CallObject(func, args);
688 Py_DECREF(args);
689 if (res == NULL)
690 return -1;
691 Py_DECREF(res);
692 return 0;
693 }
694}
695
696
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000697/* Set file and line information for the current exception.
698 If the exception is not a SyntaxError, also sets additional attributes
699 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000700
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000701void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000702PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000703{
704 PyObject *exc, *v, *tb, *tmp;
705
706 /* add attributes for the line number and filename for the error */
707 PyErr_Fetch(&exc, &v, &tb);
708 PyErr_NormalizeException(&exc, &v, &tb);
709 /* XXX check that it is, indeed, a syntax error */
710 tmp = PyInt_FromLong(lineno);
711 if (tmp == NULL)
712 PyErr_Clear();
713 else {
714 if (PyObject_SetAttrString(v, "lineno", tmp))
715 PyErr_Clear();
716 Py_DECREF(tmp);
717 }
718 if (filename != NULL) {
719 tmp = PyString_FromString(filename);
720 if (tmp == NULL)
721 PyErr_Clear();
722 else {
723 if (PyObject_SetAttrString(v, "filename", tmp))
724 PyErr_Clear();
725 Py_DECREF(tmp);
726 }
727
728 tmp = PyErr_ProgramText(filename, lineno);
729 if (tmp) {
730 PyObject_SetAttrString(v, "text", tmp);
731 Py_DECREF(tmp);
732 }
733 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000734 if (PyObject_SetAttrString(v, "offset", Py_None)) {
735 PyErr_Clear();
736 }
737 if (exc != PyExc_SyntaxError) {
738 if (!PyObject_HasAttrString(v, "msg")) {
739 tmp = PyObject_Str(v);
740 if (tmp) {
741 if (PyObject_SetAttrString(v, "msg", tmp))
742 PyErr_Clear();
743 Py_DECREF(tmp);
744 } else {
745 PyErr_Clear();
746 }
747 }
748 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
749 if (PyObject_SetAttrString(v, "print_file_and_line",
750 Py_None))
751 PyErr_Clear();
752 }
753 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000754 PyErr_Restore(exc, v, tb);
755}
756
757/* com_fetch_program_text will attempt to load the line of text that
758 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000759 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000760
761 XXX The functionality of this function is quite similar to the
762 functionality in tb_displayline() in traceback.c.
763*/
764
765PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000766PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000767{
768 FILE *fp;
769 int i;
770 char linebuf[1000];
771
Tim Petersa7444f42006-02-27 23:29:46 +0000772 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000773 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000774 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000775 if (fp == NULL)
776 return NULL;
777 for (i = 0; i < lineno; i++) {
778 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
779 do {
780 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000781 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000782 break;
783 /* fgets read *something*; if it didn't get as
784 far as pLastChar, it must have found a newline
785 or hit the end of the file; if pLastChar is \n,
786 it obviously found a newline; else we haven't
787 yet seen a newline, so must continue */
788 } while (*pLastChar != '\0' && *pLastChar != '\n');
789 }
790 fclose(fp);
791 if (i == lineno) {
792 char *p = linebuf;
793 while (*p == ' ' || *p == '\t' || *p == '\014')
794 p++;
795 return PyString_FromString(p);
796 }
797 return NULL;
798}