blob: bc77c3c1b701b507c22a498a34d5dd68c053c0ca [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{
Guido van Rossum373c8691997-04-29 18:22:47 +000069 PyObject *value = PyString_FromString(string);
70 PyErr_SetObject(exception, value);
71 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072}
73
Guido van Rossum3a241811994-08-29 12:14:12 +000074
Guido van Rossum373c8691997-04-29 18:22:47 +000075PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000076PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077{
Tim Peters024da352001-05-30 06:09:50 +000078 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000079
80 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Barry Warsawc0dc92a1997-08-22 21:22:58 +000083
84int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000086{
Barry Warsawfa5c3152000-05-02 19:27:51 +000087 if (err == NULL || exc == NULL) {
88 /* maybe caused by "import exceptions" that failed early on */
89 return 0;
90 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000091 if (PyTuple_Check(exc)) {
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)) {
109 /* problems here!? not sure PyObject_IsSubclass expects to
110 be called with an exception pending... */
111 return PyObject_IsSubclass(err, exc);
112 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000113
114 return err == exc;
115}
Guido van Rossum743007d1999-04-21 15:27:31 +0000116
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000117
118int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000120{
121 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
122}
123
124
125/* Used in many places to normalize a raised exception, including in
126 eval_code2(), do_raise(), and PyErr_Print()
127*/
128void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000129PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000130{
131 PyObject *type = *exc;
132 PyObject *value = *val;
133 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000134 PyObject *initial_tb = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000135
Guido van Rossumed473a42000-08-07 19:18:27 +0000136 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000137 /* There was no exception, so nothing to do. */
138 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000139 }
140
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000141 /* If PyErr_SetNone() was used, the value will have been actually
142 set to NULL.
143 */
144 if (!value) {
145 value = Py_None;
146 Py_INCREF(value);
147 }
148
Brett Cannonbf364092006-03-01 04:25:17 +0000149 if (PyExceptionInstance_Check(value))
150 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000151
152 /* Normalize the exception so that if the type is a class, the
153 value will be an instance.
154 */
Brett Cannonbf364092006-03-01 04:25:17 +0000155 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000156 /* if the value was not an instance, or is not an instance
157 whose class is (or is derived from) type, then use the
158 value as an argument to instantiation of the type
159 class.
160 */
Brett Cannonbf364092006-03-01 04:25:17 +0000161 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000162 PyObject *args, *res;
163
164 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000165 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000166 else if (PyTuple_Check(value)) {
167 Py_INCREF(value);
168 args = value;
169 }
170 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000171 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000172
173 if (args == NULL)
174 goto finally;
175 res = PyEval_CallObject(type, args);
176 Py_DECREF(args);
177 if (res == NULL)
178 goto finally;
179 Py_DECREF(value);
180 value = res;
181 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000182 /* if the class of the instance doesn't exactly match the
183 class of the type, believe the instance
184 */
185 else if (inclass != type) {
186 Py_DECREF(type);
187 type = inclass;
188 Py_INCREF(type);
189 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000190 }
191 *exc = type;
192 *val = value;
193 return;
194finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000195 Py_DECREF(type);
196 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000197 /* If the new exception doesn't set a traceback and the old
198 exception had a traceback, use the old traceback for the
199 new exception. It's better than nothing.
200 */
201 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000202 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000203 if (initial_tb != NULL) {
204 if (*tb == NULL)
205 *tb = initial_tb;
206 else
207 Py_DECREF(initial_tb);
208 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209 /* normalize recursively */
210 PyErr_NormalizeException(exc, val, tb);
211}
212
213
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000215PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000217 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218
219 *p_type = tstate->curexc_type;
220 *p_value = tstate->curexc_value;
221 *p_traceback = tstate->curexc_traceback;
222
223 tstate->curexc_type = NULL;
224 tstate->curexc_value = NULL;
225 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226}
227
228void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000229PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000233
234/* Convenience functions to set a type error exception and return 0 */
235
236int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000237PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000238{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000240 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000241 return 0;
242}
243
Guido van Rossum373c8691997-04-29 18:22:47 +0000244PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000246{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000247 if (PyErr_ExceptionMatches(PyExc_MemoryError))
248 /* already current */
249 return NULL;
250
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000251 /* raise the pre-allocated instance if it still exists */
252 if (PyExc_MemoryErrorInst)
253 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
254 else
255 /* this will probably fail since there's no memory and hee,
256 hee, we have to instantiate this class
257 */
258 PyErr_SetNone(PyExc_MemoryError);
259
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000260 return NULL;
261}
262
Guido van Rossum373c8691997-04-29 18:22:47 +0000263PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000264PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000265{
Guido van Rossum373c8691997-04-29 18:22:47 +0000266 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000267 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000268 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000269#ifdef PLAN9
270 char errbuf[ERRMAX];
271#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000272#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000273 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000274 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000275#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000276#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000277 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000278 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000279#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000280#ifdef PLAN9
281 rerrstr(errbuf, sizeof errbuf);
282 s = errbuf;
283#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000284 if (i == 0)
285 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000286 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000287#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000288 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000289#else
290 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000291 /* Note that the Win32 errors do not lineup with the
292 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000293 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000294 a Win32 error code
295 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000296 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000297 s = _sys_errlist[i];
298 }
299 else {
300 int len = FormatMessage(
301 FORMAT_MESSAGE_ALLOCATE_BUFFER |
302 FORMAT_MESSAGE_FROM_SYSTEM |
303 FORMAT_MESSAGE_IGNORE_INSERTS,
304 NULL, /* no message source */
305 i,
306 MAKELANGID(LANG_NEUTRAL,
307 SUBLANG_DEFAULT),
308 /* Default language */
309 (LPTSTR) &s_buf,
310 0, /* size not used */
311 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000312 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000313 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000314 situations */
315 sprintf(s_small_buf, "Windows Error 0x%X", i);
316 s = s_small_buf;
317 s_buf = NULL;
318 } else {
319 s = s_buf;
320 /* remove trailing cr/lf and dots */
321 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
322 s[--len] = '\0';
323 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000324 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000325 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000326#endif /* Unix/Windows */
327#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000328 if (filenameObject != NULL)
329 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000330 else
331 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000332 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000333 PyErr_SetObject(exc, v);
334 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000335 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000336#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000337 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000338#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000339 return NULL;
340}
Guido van Rossum743007d1999-04-21 15:27:31 +0000341
Barry Warsaw97d95151998-07-23 16:05:56 +0000342
343PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000344PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
345{
346 PyObject *name = filename ? PyString_FromString(filename) : NULL;
347 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000348 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000349 return result;
350}
351
352#ifdef Py_WIN_WIDE_FILENAMES
353PyObject *
354PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
355{
Brett Cannonbf364092006-03-01 04:25:17 +0000356 PyObject *name = filename ?
357 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000358 NULL;
359 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
360 Py_XDECREF(name);
361 return result;
362}
363#endif /* Py_WIN_WIDE_FILENAMES */
364
365PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000366PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000367{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000368 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000369}
Guido van Rossum683a0721990-10-21 22:09:12 +0000370
Brett Cannonbf364092006-03-01 04:25:17 +0000371#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000372/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000373PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000374 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000375 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000376 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000377{
378 int len;
379 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000380 char *s_buf = NULL; /* Free via LocalFree */
381 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000382 PyObject *v;
383 DWORD err = (DWORD)ierr;
384 if (err==0) err = GetLastError();
385 len = FormatMessage(
386 /* Error API error */
387 FORMAT_MESSAGE_ALLOCATE_BUFFER |
388 FORMAT_MESSAGE_FROM_SYSTEM |
389 FORMAT_MESSAGE_IGNORE_INSERTS,
390 NULL, /* no message source */
391 err,
392 MAKELANGID(LANG_NEUTRAL,
393 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000394 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000395 0, /* size not used */
396 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000397 if (len==0) {
398 /* Only seen this in out of mem situations */
399 sprintf(s_small_buf, "Windows Error 0x%X", err);
400 s = s_small_buf;
401 s_buf = NULL;
402 } else {
403 s = s_buf;
404 /* remove trailing cr/lf and dots */
405 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
406 s[--len] = '\0';
407 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000408 if (filenameObject != NULL)
409 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000410 else
411 v = Py_BuildValue("(is)", err, s);
412 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000413 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000414 Py_DECREF(v);
415 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000416 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000417 return NULL;
418}
419
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000420PyObject *PyErr_SetExcFromWindowsErrWithFilename(
421 PyObject *exc,
422 int ierr,
423 const char *filename)
424{
425 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000426 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
427 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000428 name);
429 Py_XDECREF(name);
430 return ret;
431}
432
433#ifdef Py_WIN_WIDE_FILENAMES
434PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
435 PyObject *exc,
436 int ierr,
437 const Py_UNICODE *filename)
438{
Brett Cannonbf364092006-03-01 04:25:17 +0000439 PyObject *name = filename ?
440 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000441 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#endif /* Py_WIN_WIDE_FILENAMES */
449
Thomas Heller085358a2002-07-29 14:27:41 +0000450PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
451{
452 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
453}
454
Guido van Rossum795e1892000-02-17 15:19:15 +0000455PyObject *PyErr_SetFromWindowsErr(int ierr)
456{
Thomas Heller085358a2002-07-29 14:27:41 +0000457 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
458 ierr, NULL);
459}
460PyObject *PyErr_SetFromWindowsErrWithFilename(
461 int ierr,
462 const char *filename)
463{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000464 PyObject *name = filename ? PyString_FromString(filename) : NULL;
465 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
466 PyExc_WindowsError,
467 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000468 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000469 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000470}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000471
472#ifdef Py_WIN_WIDE_FILENAMES
473PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
474 int ierr,
475 const Py_UNICODE *filename)
476{
Brett Cannonbf364092006-03-01 04:25:17 +0000477 PyObject *name = filename ?
478 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000479 NULL;
480 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
481 PyExc_WindowsError,
482 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000483 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000484 return result;
485}
486#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000487#endif /* MS_WINDOWS */
488
Guido van Rossum683a0721990-10-21 22:09:12 +0000489void
Fred Drake6d63adf2000-08-24 22:38:39 +0000490_PyErr_BadInternalCall(char *filename, int lineno)
491{
492 PyErr_Format(PyExc_SystemError,
493 "%s:%d: bad argument to internal function",
494 filename, lineno);
495}
496
497/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
498 export the entry point for existing object code: */
499#undef PyErr_BadInternalCall
500void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000501PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000502{
Fred Drake6d63adf2000-08-24 22:38:39 +0000503 PyErr_Format(PyExc_SystemError,
504 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000505}
Fred Drake6d63adf2000-08-24 22:38:39 +0000506#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
507
Guido van Rossum1548bac1997-02-14 17:09:47 +0000508
509
Guido van Rossum1548bac1997-02-14 17:09:47 +0000510PyObject *
511PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000512{
513 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000514 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000515
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000516#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000517 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000518#else
519 va_start(vargs);
520#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000521
Barry Warsaw876c8cb2001-08-24 18:35:23 +0000522 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000523 PyErr_SetObject(exception, string);
524 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000525 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000526 return NULL;
527}
Guido van Rossum7617e051997-09-16 18:43:50 +0000528
529
Georg Brandl658d5132006-05-23 11:17:21 +0000530
Guido van Rossum7617e051997-09-16 18:43:50 +0000531PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000532PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000533{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000534 char *dot;
535 PyObject *modulename = NULL;
536 PyObject *classname = NULL;
537 PyObject *mydict = NULL;
538 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000539 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000540 dot = strrchr(name, '.');
541 if (dot == NULL) {
542 PyErr_SetString(PyExc_SystemError,
543 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000544 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000545 }
546 if (base == NULL)
547 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000548 if (dict == NULL) {
549 dict = mydict = PyDict_New();
550 if (dict == NULL)
551 goto failure;
552 }
553 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Armin Rigo4b63c212006-10-04 11:44:06 +0000554 modulename = PyString_FromStringAndSize(name,
555 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000556 if (modulename == NULL)
557 goto failure;
558 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
559 goto failure;
560 }
Georg Brandl658d5132006-05-23 11:17:21 +0000561 if (PyTuple_Check(base)) {
562 bases = base;
563 /* INCREF as we create a new ref in the else branch */
564 Py_INCREF(bases);
565 } else {
566 bases = PyTuple_Pack(1, base);
567 if (bases == NULL)
568 goto failure;
569 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000570 /* Create a real new-style class. */
571 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
572 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000573 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000574 Py_XDECREF(bases);
575 Py_XDECREF(mydict);
576 Py_XDECREF(classname);
577 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000578 return result;
579}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000580
581/* Call when an exception has occurred but there is no way for Python
582 to handle it. Examples: exception in __del__ or during GC. */
583void
584PyErr_WriteUnraisable(PyObject *obj)
585{
586 PyObject *f, *t, *v, *tb;
587 PyErr_Fetch(&t, &v, &tb);
588 f = PySys_GetObject("stderr");
589 if (f != NULL) {
590 PyFile_WriteString("Exception ", f);
591 if (t) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000592 PyObject* moduleName;
Neal Norwitz036b3be2007-02-26 23:46:51 +0000593 char* className = NULL;
594 if (PyExceptionClass_Check(t))
595 className = PyExceptionClass_Name(t);
596 else if (PyString_Check(t))
597 className = PyString_AS_STRING(t);
Brett Cannonbf364092006-03-01 04:25:17 +0000598
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000599 if (className != NULL) {
600 char *dot = strrchr(className, '.');
601 if (dot != NULL)
602 className = dot+1;
603 }
604
605 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000606 if (moduleName == NULL)
607 PyFile_WriteString("<unknown>", f);
608 else {
609 char* modstr = PyString_AsString(moduleName);
610 if (modstr)
611 {
612 PyFile_WriteString(modstr, f);
613 PyFile_WriteString(".", f);
614 }
615 }
616 if (className == NULL)
617 PyFile_WriteString("<unknown>", f);
618 else
619 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000620 if (v && v != Py_None) {
621 PyFile_WriteString(": ", f);
622 PyFile_WriteObject(v, f, 0);
623 }
Neal Norwitz1a269202006-04-17 00:33:23 +0000624 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000625 }
626 PyFile_WriteString(" in ", f);
627 PyFile_WriteObject(obj, f, 0);
628 PyFile_WriteString(" ignored\n", f);
629 PyErr_Clear(); /* Just in case */
630 }
631 Py_XDECREF(t);
632 Py_XDECREF(v);
633 Py_XDECREF(tb);
634}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000635
Armin Rigo092381a2003-10-25 14:29:27 +0000636extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000637
638/* Function to issue a warning message; may raise an exception. */
639int
Neal Norwitz07aadb12006-07-30 06:55:48 +0000640PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000641{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000642 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000643 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000644
Mark Hammondedd07732003-07-15 23:03:55 +0000645 if (warnings_module != NULL) {
646 dict = PyModule_GetDict(warnings_module);
Neal Norwitz7770f9f2007-01-05 05:28:50 +0000647 if (dict != NULL)
648 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000649 }
650 if (func == NULL) {
651 PySys_WriteStderr("warning: %s\n", message);
652 return 0;
653 }
654 else {
Richard Jones7b9558d2006-05-27 12:29:24 +0000655 PyObject *res;
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000656
657 if (category == NULL)
658 category = PyExc_RuntimeWarning;
Neal Norwitz07aadb12006-07-30 06:55:48 +0000659 res = PyObject_CallFunction(func, "sOn",
660 message, category, stack_level);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000661 if (res == NULL)
662 return -1;
663 Py_DECREF(res);
664 return 0;
665 }
666}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000667
Neal Norwitz07aadb12006-07-30 06:55:48 +0000668/* PyErr_Warn is only for backwards compatability and will be removed.
669 Use PyErr_WarnEx instead. */
670
671#undef PyErr_Warn
672
Thomas Heller74d36f02006-08-04 18:17:40 +0000673PyAPI_FUNC(int)
Neal Norwitz07aadb12006-07-30 06:55:48 +0000674PyErr_Warn(PyObject *category, char *message)
675{
676 return PyErr_WarnEx(category, message, 1);
677}
Guido van Rossum2fd45652001-02-28 21:46:24 +0000678
679/* Warning with explicit origin */
680int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000681PyErr_WarnExplicit(PyObject *category, const char *message,
682 const char *filename, int lineno,
683 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000684{
685 PyObject *mod, *dict, *func = NULL;
686
687 mod = PyImport_ImportModule("warnings");
688 if (mod != NULL) {
689 dict = PyModule_GetDict(mod);
690 func = PyDict_GetItemString(dict, "warn_explicit");
691 Py_DECREF(mod);
692 }
693 if (func == NULL) {
694 PySys_WriteStderr("warning: %s\n", message);
695 return 0;
696 }
697 else {
Richard Jones7b9558d2006-05-27 12:29:24 +0000698 PyObject *res;
Guido van Rossum2fd45652001-02-28 21:46:24 +0000699
700 if (category == NULL)
701 category = PyExc_RuntimeWarning;
702 if (registry == NULL)
703 registry = Py_None;
Richard Jones7b9558d2006-05-27 12:29:24 +0000704 res = PyObject_CallFunction(func, "sOsizO", message, category,
705 filename, lineno, module, registry);
Guido van Rossum2fd45652001-02-28 21:46:24 +0000706 if (res == NULL)
707 return -1;
708 Py_DECREF(res);
709 return 0;
710 }
711}
712
713
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000714/* Set file and line information for the current exception.
715 If the exception is not a SyntaxError, also sets additional attributes
716 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000717
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000718void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000719PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000720{
721 PyObject *exc, *v, *tb, *tmp;
722
723 /* add attributes for the line number and filename for the error */
724 PyErr_Fetch(&exc, &v, &tb);
725 PyErr_NormalizeException(&exc, &v, &tb);
Richard Jones7b9558d2006-05-27 12:29:24 +0000726 /* XXX check that it is, indeed, a syntax error. It might not
727 * be, though. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000728 tmp = PyInt_FromLong(lineno);
729 if (tmp == NULL)
730 PyErr_Clear();
731 else {
732 if (PyObject_SetAttrString(v, "lineno", tmp))
733 PyErr_Clear();
734 Py_DECREF(tmp);
735 }
736 if (filename != NULL) {
737 tmp = PyString_FromString(filename);
738 if (tmp == NULL)
739 PyErr_Clear();
740 else {
741 if (PyObject_SetAttrString(v, "filename", tmp))
742 PyErr_Clear();
743 Py_DECREF(tmp);
744 }
745
746 tmp = PyErr_ProgramText(filename, lineno);
747 if (tmp) {
Georg Brandla1121fa2006-05-29 14:13:21 +0000748 if (PyObject_SetAttrString(v, "text", tmp))
749 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000750 Py_DECREF(tmp);
751 }
752 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000753 if (PyObject_SetAttrString(v, "offset", Py_None)) {
754 PyErr_Clear();
755 }
756 if (exc != PyExc_SyntaxError) {
757 if (!PyObject_HasAttrString(v, "msg")) {
758 tmp = PyObject_Str(v);
759 if (tmp) {
760 if (PyObject_SetAttrString(v, "msg", tmp))
761 PyErr_Clear();
762 Py_DECREF(tmp);
763 } else {
764 PyErr_Clear();
765 }
766 }
767 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
768 if (PyObject_SetAttrString(v, "print_file_and_line",
769 Py_None))
770 PyErr_Clear();
771 }
772 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000773 PyErr_Restore(exc, v, tb);
774}
775
776/* com_fetch_program_text will attempt to load the line of text that
777 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000778 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000779
780 XXX The functionality of this function is quite similar to the
781 functionality in tb_displayline() in traceback.c.
782*/
783
784PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000785PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000786{
787 FILE *fp;
788 int i;
789 char linebuf[1000];
790
Tim Petersa7444f42006-02-27 23:29:46 +0000791 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000792 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000793 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000794 if (fp == NULL)
795 return NULL;
796 for (i = 0; i < lineno; i++) {
797 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
798 do {
799 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000800 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000801 break;
802 /* fgets read *something*; if it didn't get as
803 far as pLastChar, it must have found a newline
Walter Dörwaldc611f172006-05-25 08:53:28 +0000804 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000805 it obviously found a newline; else we haven't
806 yet seen a newline, so must continue */
807 } while (*pLastChar != '\0' && *pLastChar != '\n');
808 }
809 fclose(fp);
810 if (i == lineno) {
811 char *p = linebuf;
812 while (*p == ' ' || *p == '\t' || *p == '\014')
813 p++;
814 return PyString_FromString(p);
815 }
816 return NULL;
817}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000818
819#ifdef __cplusplus
820}
821#endif
822