blob: 2a84c8d30dc56324b24fcf696b55074cbc379ff2 [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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{
Thomas Wouters303de6a2006-04-20 22:42:37 +000055 if (exception != NULL &&
56 !PyExceptionClass_Check(exception)) {
Thomas Wouters303de6a2006-04-20 22:42:37 +000057 PyErr_Format(PyExc_SystemError,
Walter Dörwald573c08c2007-05-25 15:46:59 +000058 "exception %R not a BaseException subclass",
59 exception);
Thomas Wouters303de6a2006-04-20 22:42:37 +000060 return;
61 }
Guido van Rossum373c8691997-04-29 18:22:47 +000062 Py_XINCREF(exception);
63 Py_XINCREF(value);
64 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065}
66
67void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069{
Guido van Rossum373c8691997-04-29 18:22:47 +000070 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
73void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000074PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075{
Walter Dörwald573c08c2007-05-25 15:46:59 +000076 PyObject *value = PyUnicode_FromString(string);
Guido van Rossum373c8691997-04-29 18:22:47 +000077 PyErr_SetObject(exception, value);
78 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079}
80
Guido van Rossum3a241811994-08-29 12:14:12 +000081
Guido van Rossum373c8691997-04-29 18:22:47 +000082PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000083PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Tim Peters024da352001-05-30 06:09:50 +000085 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000086
87 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088}
89
Barry Warsawc0dc92a1997-08-22 21:22:58 +000090
91int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000093{
Barry Warsawfa5c3152000-05-02 19:27:51 +000094 if (err == NULL || exc == NULL) {
95 /* maybe caused by "import exceptions" that failed early on */
96 return 0;
97 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000098 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +000099 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000100 n = PyTuple_Size(exc);
101 for (i = 0; i < n; i++) {
102 /* Test recursively */
103 if (PyErr_GivenExceptionMatches(
104 err, PyTuple_GET_ITEM(exc, i)))
105 {
106 return 1;
107 }
108 }
109 return 0;
110 }
111 /* err might be an instance, so check its class. */
Brett Cannonbf364092006-03-01 04:25:17 +0000112 if (PyExceptionInstance_Check(err))
113 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000114
Brett Cannonbf364092006-03-01 04:25:17 +0000115 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
116 /* problems here!? not sure PyObject_IsSubclass expects to
117 be called with an exception pending... */
118 return PyObject_IsSubclass(err, exc);
119 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000120
121 return err == exc;
122}
Guido van Rossum743007d1999-04-21 15:27:31 +0000123
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000124
125int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000127{
128 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
129}
130
131
132/* Used in many places to normalize a raised exception, including in
133 eval_code2(), do_raise(), and PyErr_Print()
134*/
135void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000137{
138 PyObject *type = *exc;
139 PyObject *value = *val;
140 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000141 PyObject *initial_tb = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000142
Guido van Rossumed473a42000-08-07 19:18:27 +0000143 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000144 /* There was no exception, so nothing to do. */
145 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000146 }
147
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000148 /* If PyErr_SetNone() was used, the value will have been actually
149 set to NULL.
150 */
151 if (!value) {
152 value = Py_None;
153 Py_INCREF(value);
154 }
155
Brett Cannonbf364092006-03-01 04:25:17 +0000156 if (PyExceptionInstance_Check(value))
157 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000158
159 /* Normalize the exception so that if the type is a class, the
160 value will be an instance.
161 */
Brett Cannonbf364092006-03-01 04:25:17 +0000162 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000163 /* if the value was not an instance, or is not an instance
164 whose class is (or is derived from) type, then use the
165 value as an argument to instantiation of the type
166 class.
167 */
Brett Cannonbf364092006-03-01 04:25:17 +0000168 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000169 PyObject *args, *res;
170
171 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000172 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000173 else if (PyTuple_Check(value)) {
174 Py_INCREF(value);
175 args = value;
176 }
177 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000178 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000179
180 if (args == NULL)
181 goto finally;
182 res = PyEval_CallObject(type, args);
183 Py_DECREF(args);
184 if (res == NULL)
185 goto finally;
186 Py_DECREF(value);
187 value = res;
188 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000189 /* if the class of the instance doesn't exactly match the
190 class of the type, believe the instance
191 */
192 else if (inclass != type) {
193 Py_DECREF(type);
194 type = inclass;
195 Py_INCREF(type);
196 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000197 }
198 *exc = type;
199 *val = value;
200 return;
201finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000202 Py_DECREF(type);
203 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000204 /* If the new exception doesn't set a traceback and the old
205 exception had a traceback, use the old traceback for the
206 new exception. It's better than nothing.
207 */
208 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000210 if (initial_tb != NULL) {
211 if (*tb == NULL)
212 *tb = initial_tb;
213 else
214 Py_DECREF(initial_tb);
215 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000216 /* normalize recursively */
217 PyErr_NormalizeException(exc, val, tb);
218}
219
220
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000222PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000224 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000225
226 *p_type = tstate->curexc_type;
227 *p_value = tstate->curexc_value;
228 *p_traceback = tstate->curexc_traceback;
229
230 tstate->curexc_type = NULL;
231 tstate->curexc_value = NULL;
232 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233}
234
235void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000236PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000238 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000240
241/* Convenience functions to set a type error exception and return 0 */
242
243int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000244PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000245{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000247 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000248 return 0;
249}
250
Guido van Rossum373c8691997-04-29 18:22:47 +0000251PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000253{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000254 if (PyErr_ExceptionMatches(PyExc_MemoryError))
255 /* already current */
256 return NULL;
257
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000258 /* raise the pre-allocated instance if it still exists */
259 if (PyExc_MemoryErrorInst)
260 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
261 else
262 /* this will probably fail since there's no memory and hee,
263 hee, we have to instantiate this class
264 */
265 PyErr_SetNone(PyExc_MemoryError);
266
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000267 return NULL;
268}
269
Guido van Rossum373c8691997-04-29 18:22:47 +0000270PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000271PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000272{
Guido van Rossum373c8691997-04-29 18:22:47 +0000273 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000274 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000275 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000276#ifdef PLAN9
277 char errbuf[ERRMAX];
278#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000279#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000280 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000281 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000282#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000283#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000284 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000285 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000286#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000287#ifdef PLAN9
288 rerrstr(errbuf, sizeof errbuf);
289 s = errbuf;
290#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000291 if (i == 0)
292 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000293 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000294#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000295 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000296#else
297 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000298 /* Note that the Win32 errors do not lineup with the
299 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000300 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000301 a Win32 error code
302 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000303 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000304 s = _sys_errlist[i];
305 }
306 else {
307 int len = FormatMessage(
308 FORMAT_MESSAGE_ALLOCATE_BUFFER |
309 FORMAT_MESSAGE_FROM_SYSTEM |
310 FORMAT_MESSAGE_IGNORE_INSERTS,
311 NULL, /* no message source */
312 i,
313 MAKELANGID(LANG_NEUTRAL,
314 SUBLANG_DEFAULT),
315 /* Default language */
316 (LPTSTR) &s_buf,
317 0, /* size not used */
318 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000319 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000320 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000321 situations */
322 sprintf(s_small_buf, "Windows Error 0x%X", i);
323 s = s_small_buf;
324 s_buf = NULL;
325 } else {
326 s = s_buf;
327 /* remove trailing cr/lf and dots */
328 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
329 s[--len] = '\0';
330 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000331 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000332 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000333#endif /* Unix/Windows */
334#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000335 if (filenameObject != NULL)
336 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000337 else
338 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000339 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000340 PyErr_SetObject(exc, v);
341 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000342 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000343#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000344 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000345#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000346 return NULL;
347}
Guido van Rossum743007d1999-04-21 15:27:31 +0000348
Barry Warsaw97d95151998-07-23 16:05:56 +0000349
350PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000351PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
352{
353 PyObject *name = filename ? PyString_FromString(filename) : NULL;
354 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000355 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000356 return result;
357}
358
359#ifdef Py_WIN_WIDE_FILENAMES
360PyObject *
361PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
362{
Brett Cannonbf364092006-03-01 04:25:17 +0000363 PyObject *name = filename ?
364 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000365 NULL;
366 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
367 Py_XDECREF(name);
368 return result;
369}
370#endif /* Py_WIN_WIDE_FILENAMES */
371
372PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000373PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000374{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000375 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000376}
Guido van Rossum683a0721990-10-21 22:09:12 +0000377
Brett Cannonbf364092006-03-01 04:25:17 +0000378#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000379/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000380PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000381 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000383 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000384{
385 int len;
386 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000387 char *s_buf = NULL; /* Free via LocalFree */
388 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000389 PyObject *v;
390 DWORD err = (DWORD)ierr;
391 if (err==0) err = GetLastError();
392 len = FormatMessage(
393 /* Error API error */
394 FORMAT_MESSAGE_ALLOCATE_BUFFER |
395 FORMAT_MESSAGE_FROM_SYSTEM |
396 FORMAT_MESSAGE_IGNORE_INSERTS,
397 NULL, /* no message source */
398 err,
399 MAKELANGID(LANG_NEUTRAL,
400 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000401 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000402 0, /* size not used */
403 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000404 if (len==0) {
405 /* Only seen this in out of mem situations */
406 sprintf(s_small_buf, "Windows Error 0x%X", err);
407 s = s_small_buf;
408 s_buf = NULL;
409 } else {
410 s = s_buf;
411 /* remove trailing cr/lf and dots */
412 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
413 s[--len] = '\0';
414 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000415 if (filenameObject != NULL)
416 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000417 else
418 v = Py_BuildValue("(is)", err, s);
419 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000420 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000421 Py_DECREF(v);
422 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000423 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000424 return NULL;
425}
426
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000427PyObject *PyErr_SetExcFromWindowsErrWithFilename(
428 PyObject *exc,
429 int ierr,
430 const char *filename)
431{
432 PyObject *name = filename ? PyString_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000433 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
434 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000435 name);
436 Py_XDECREF(name);
437 return ret;
438}
439
440#ifdef Py_WIN_WIDE_FILENAMES
441PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
442 PyObject *exc,
443 int ierr,
444 const Py_UNICODE *filename)
445{
Brett Cannonbf364092006-03-01 04:25:17 +0000446 PyObject *name = filename ?
447 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000448 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000449 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
450 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000451 name);
452 Py_XDECREF(name);
453 return ret;
454}
455#endif /* Py_WIN_WIDE_FILENAMES */
456
Thomas Heller085358a2002-07-29 14:27:41 +0000457PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
458{
459 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
460}
461
Guido van Rossum795e1892000-02-17 15:19:15 +0000462PyObject *PyErr_SetFromWindowsErr(int ierr)
463{
Thomas Heller085358a2002-07-29 14:27:41 +0000464 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
465 ierr, NULL);
466}
467PyObject *PyErr_SetFromWindowsErrWithFilename(
468 int ierr,
469 const char *filename)
470{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000471 PyObject *name = filename ? PyString_FromString(filename) : NULL;
472 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
473 PyExc_WindowsError,
474 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000475 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000476 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000477}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000478
479#ifdef Py_WIN_WIDE_FILENAMES
480PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
481 int ierr,
482 const Py_UNICODE *filename)
483{
Brett Cannonbf364092006-03-01 04:25:17 +0000484 PyObject *name = filename ?
485 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000486 NULL;
487 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
488 PyExc_WindowsError,
489 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000490 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000491 return result;
492}
493#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000494#endif /* MS_WINDOWS */
495
Guido van Rossum683a0721990-10-21 22:09:12 +0000496void
Fred Drake6d63adf2000-08-24 22:38:39 +0000497_PyErr_BadInternalCall(char *filename, int lineno)
498{
499 PyErr_Format(PyExc_SystemError,
500 "%s:%d: bad argument to internal function",
501 filename, lineno);
502}
503
504/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
505 export the entry point for existing object code: */
506#undef PyErr_BadInternalCall
507void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000508PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000509{
Fred Drake6d63adf2000-08-24 22:38:39 +0000510 PyErr_Format(PyExc_SystemError,
511 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000512}
Fred Drake6d63adf2000-08-24 22:38:39 +0000513#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
514
Guido van Rossum1548bac1997-02-14 17:09:47 +0000515
516
Guido van Rossum1548bac1997-02-14 17:09:47 +0000517PyObject *
518PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000519{
520 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000521 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000522
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000523#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000524 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000525#else
526 va_start(vargs);
527#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000528
Walter Dörwald573c08c2007-05-25 15:46:59 +0000529 string = PyUnicode_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000530 PyErr_SetObject(exception, string);
531 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000532 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000533 return NULL;
534}
Guido van Rossum7617e051997-09-16 18:43:50 +0000535
536
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537
Guido van Rossum7617e051997-09-16 18:43:50 +0000538PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000540{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000541 char *dot;
542 PyObject *modulename = NULL;
543 PyObject *classname = NULL;
544 PyObject *mydict = NULL;
545 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000546 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000547 dot = strrchr(name, '.');
548 if (dot == NULL) {
549 PyErr_SetString(PyExc_SystemError,
550 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000551 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000552 }
553 if (base == NULL)
554 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000555 if (dict == NULL) {
556 dict = mydict = PyDict_New();
557 if (dict == NULL)
558 goto failure;
559 }
560 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000561 modulename = PyString_FromStringAndSize(name,
562 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000563 if (modulename == NULL)
564 goto failure;
565 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
566 goto failure;
567 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568 if (PyTuple_Check(base)) {
569 bases = base;
570 /* INCREF as we create a new ref in the else branch */
571 Py_INCREF(bases);
572 } else {
573 bases = PyTuple_Pack(1, base);
574 if (bases == NULL)
575 goto failure;
576 }
577 /* Create a real new-style class. */
578 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
579 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000580 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000581 Py_XDECREF(bases);
582 Py_XDECREF(mydict);
583 Py_XDECREF(classname);
584 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000585 return result;
586}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000587
588/* Call when an exception has occurred but there is no way for Python
589 to handle it. Examples: exception in __del__ or during GC. */
590void
591PyErr_WriteUnraisable(PyObject *obj)
592{
593 PyObject *f, *t, *v, *tb;
594 PyErr_Fetch(&t, &v, &tb);
595 f = PySys_GetObject("stderr");
596 if (f != NULL) {
597 PyFile_WriteString("Exception ", f);
598 if (t) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000599 PyObject* moduleName;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000600 char* className;
601 assert(PyExceptionClass_Check(t));
602 className = PyExceptionClass_Name(t);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000603 if (className != NULL) {
604 char *dot = strrchr(className, '.');
605 if (dot != NULL)
606 className = dot+1;
607 }
608
609 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000610 if (moduleName == NULL)
611 PyFile_WriteString("<unknown>", f);
612 else {
613 char* modstr = PyString_AsString(moduleName);
Neal Norwitz2633c692007-02-26 22:22:47 +0000614 if (modstr &&
615 strcmp(modstr, "__builtin__") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000616 {
617 PyFile_WriteString(modstr, f);
618 PyFile_WriteString(".", f);
619 }
620 }
621 if (className == NULL)
622 PyFile_WriteString("<unknown>", f);
623 else
624 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000625 if (v && v != Py_None) {
626 PyFile_WriteString(": ", f);
627 PyFile_WriteObject(v, f, 0);
628 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000629 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000630 }
631 PyFile_WriteString(" in ", f);
632 PyFile_WriteObject(obj, f, 0);
633 PyFile_WriteString(" ignored\n", f);
634 PyErr_Clear(); /* Just in case */
635 }
636 Py_XDECREF(t);
637 Py_XDECREF(v);
638 Py_XDECREF(tb);
639}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000640
Armin Rigo092381a2003-10-25 14:29:27 +0000641extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000642
643/* Function to issue a warning message; may raise an exception. */
644int
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000645PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000646{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000647 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000648 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000649
Mark Hammondedd07732003-07-15 23:03:55 +0000650 if (warnings_module != NULL) {
651 dict = PyModule_GetDict(warnings_module);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000652 if (dict != NULL)
653 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000654 }
655 if (func == NULL) {
656 PySys_WriteStderr("warning: %s\n", message);
657 return 0;
658 }
659 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000660 PyObject *res;
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000661
662 if (category == NULL)
663 category = PyExc_RuntimeWarning;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000664 res = PyObject_CallFunction(func, "sOn",
665 message, category, stack_level);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000666 if (res == NULL)
667 return -1;
668 Py_DECREF(res);
669 return 0;
670 }
671}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000672
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673/* PyErr_Warn is only for backwards compatability and will be removed.
674 Use PyErr_WarnEx instead. */
675
676#undef PyErr_Warn
677
678PyAPI_FUNC(int)
679PyErr_Warn(PyObject *category, char *message)
680{
681 return PyErr_WarnEx(category, message, 1);
682}
Guido van Rossum2fd45652001-02-28 21:46:24 +0000683
684/* Warning with explicit origin */
685int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000686PyErr_WarnExplicit(PyObject *category, const char *message,
687 const char *filename, int lineno,
688 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000689{
690 PyObject *mod, *dict, *func = NULL;
691
692 mod = PyImport_ImportModule("warnings");
693 if (mod != NULL) {
694 dict = PyModule_GetDict(mod);
695 func = PyDict_GetItemString(dict, "warn_explicit");
696 Py_DECREF(mod);
697 }
698 if (func == NULL) {
699 PySys_WriteStderr("warning: %s\n", message);
700 return 0;
701 }
702 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000703 PyObject *res;
Guido van Rossum2fd45652001-02-28 21:46:24 +0000704
705 if (category == NULL)
706 category = PyExc_RuntimeWarning;
707 if (registry == NULL)
708 registry = Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000709 res = PyObject_CallFunction(func, "sOsizO", message, category,
710 filename, lineno, module, registry);
Guido van Rossum2fd45652001-02-28 21:46:24 +0000711 if (res == NULL)
712 return -1;
713 Py_DECREF(res);
714 return 0;
715 }
716}
717
718
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000719/* Set file and line information for the current exception.
720 If the exception is not a SyntaxError, also sets additional attributes
721 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000722
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000723void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000724PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000725{
726 PyObject *exc, *v, *tb, *tmp;
727
728 /* add attributes for the line number and filename for the error */
729 PyErr_Fetch(&exc, &v, &tb);
730 PyErr_NormalizeException(&exc, &v, &tb);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000731 /* XXX check that it is, indeed, a syntax error. It might not
732 * be, though. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000733 tmp = PyInt_FromLong(lineno);
734 if (tmp == NULL)
735 PyErr_Clear();
736 else {
737 if (PyObject_SetAttrString(v, "lineno", tmp))
738 PyErr_Clear();
739 Py_DECREF(tmp);
740 }
741 if (filename != NULL) {
742 tmp = PyString_FromString(filename);
743 if (tmp == NULL)
744 PyErr_Clear();
745 else {
746 if (PyObject_SetAttrString(v, "filename", tmp))
747 PyErr_Clear();
748 Py_DECREF(tmp);
749 }
750
751 tmp = PyErr_ProgramText(filename, lineno);
752 if (tmp) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000753 if (PyObject_SetAttrString(v, "text", tmp))
754 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000755 Py_DECREF(tmp);
756 }
757 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000758 if (PyObject_SetAttrString(v, "offset", Py_None)) {
759 PyErr_Clear();
760 }
761 if (exc != PyExc_SyntaxError) {
762 if (!PyObject_HasAttrString(v, "msg")) {
763 tmp = PyObject_Str(v);
764 if (tmp) {
765 if (PyObject_SetAttrString(v, "msg", tmp))
766 PyErr_Clear();
767 Py_DECREF(tmp);
768 } else {
769 PyErr_Clear();
770 }
771 }
772 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
773 if (PyObject_SetAttrString(v, "print_file_and_line",
774 Py_None))
775 PyErr_Clear();
776 }
777 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000778 PyErr_Restore(exc, v, tb);
779}
780
781/* com_fetch_program_text will attempt to load the line of text that
782 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000783 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000784
785 XXX The functionality of this function is quite similar to the
786 functionality in tb_displayline() in traceback.c.
787*/
788
789PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000790PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000791{
792 FILE *fp;
793 int i;
794 char linebuf[1000];
795
Tim Petersa7444f42006-02-27 23:29:46 +0000796 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000797 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000798 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000799 if (fp == NULL)
800 return NULL;
801 for (i = 0; i < lineno; i++) {
802 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
803 do {
804 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000805 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000806 break;
807 /* fgets read *something*; if it didn't get as
808 far as pLastChar, it must have found a newline
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000810 it obviously found a newline; else we haven't
811 yet seen a newline, so must continue */
812 } while (*pLastChar != '\0' && *pLastChar != '\n');
813 }
814 fclose(fp);
815 if (i == lineno) {
816 char *p = linebuf;
817 while (*p == ' ' || *p == '\t' || *p == '\014')
818 p++;
819 return PyString_FromString(p);
820 }
821 return NULL;
822}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000823
824#ifdef __cplusplus
825}
826#endif