blob: da4b463d5e3fafeb3bb8af4afdde0d1f3f2ee97e [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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000027 PyThreadState *tstate = PyThreadState_GET();
28 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000030 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */
32 /* Well, it could be None. */
33 Py_DECREF(traceback);
34 traceback = NULL;
35 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000036
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000037 /* 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;
Guido van Rossuma027efa1997-05-05 20:56:21 +000042
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000043 tstate->curexc_type = type;
44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000046
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000047 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000078 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000079
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000080 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000087 if (err == NULL || exc == NULL) {
88 /* maybe caused by "import exceptions" that failed early on */
89 return 0;
90 }
91 if (PyTuple_Check(exc)) {
92 Py_ssize_t i, n;
93 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. */
105 if (PyExceptionInstance_Check(err))
106 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000107
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000108 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
109 int res = 0;
110 PyObject *exception, *value, *tb;
111 PyErr_Fetch(&exception, &value, &tb);
112 res = PyObject_IsSubclass(err, exc);
113 /* This function must not fail, so print the error here */
114 if (res == -1) {
115 PyErr_WriteUnraisable(err);
116 res = 0;
117 }
118 PyErr_Restore(exception, value, tb);
119 return res;
120 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000121
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000122 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000123}
Guido van Rossum743007d1999-04-21 15:27:31 +0000124
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000125
126int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000128{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000129 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000130}
131
132
133/* Used in many places to normalize a raised exception, including in
134 eval_code2(), do_raise(), and PyErr_Print()
135*/
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000138{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000139 PyObject *type = *exc;
140 PyObject *value = *val;
141 PyObject *inclass = NULL;
142 PyObject *initial_tb = NULL;
143 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000144
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000145 if (type == NULL) {
146 /* There was no exception, so nothing to do. */
147 return;
148 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000149
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000150 /* If PyErr_SetNone() was used, the value will have been actually
151 set to NULL.
152 */
153 if (!value) {
154 value = Py_None;
155 Py_INCREF(value);
156 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000157
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000158 if (PyExceptionInstance_Check(value))
159 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000160
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000161 /* Normalize the exception so that if the type is a class, the
162 value will be an instance.
163 */
164 if (PyExceptionClass_Check(type)) {
165 /* if the value was not an instance, or is not an instance
166 whose class is (or is derived from) type, then use the
167 value as an argument to instantiation of the type
168 class.
169 */
170 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
171 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000172
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000173 if (value == Py_None)
174 args = PyTuple_New(0);
175 else if (PyTuple_Check(value)) {
176 Py_INCREF(value);
177 args = value;
178 }
179 else
180 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000181
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000182 if (args == NULL)
183 goto finally;
184 res = PyEval_CallObject(type, args);
185 Py_DECREF(args);
186 if (res == NULL)
187 goto finally;
188 Py_DECREF(value);
189 value = res;
190 }
191 /* if the class of the instance doesn't exactly match the
192 class of the type, believe the instance
193 */
194 else if (inclass != type) {
195 Py_DECREF(type);
196 type = inclass;
197 Py_INCREF(type);
198 }
199 }
200 *exc = type;
201 *val = value;
202 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000203finally:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000204 Py_DECREF(type);
205 Py_DECREF(value);
206 /* If the new exception doesn't set a traceback and the old
207 exception had a traceback, use the old traceback for the
208 new exception. It's better than nothing.
209 */
210 initial_tb = *tb;
211 PyErr_Fetch(exc, val, tb);
212 if (initial_tb != NULL) {
213 if (*tb == NULL)
214 *tb = initial_tb;
215 else
216 Py_DECREF(initial_tb);
217 }
218 /* normalize recursively */
219 tstate = PyThreadState_GET();
220 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
221 --tstate->recursion_depth;
222 /* throw away the old exception... */
223 Py_DECREF(*exc);
224 Py_DECREF(*val);
225 /* ... and use the recursion error instead */
226 *exc = PyExc_RuntimeError;
227 *val = PyExc_RecursionErrorInst;
228 Py_INCREF(*exc);
229 Py_INCREF(*val);
230 /* just keeping the old traceback */
231 return;
232 }
233 PyErr_NormalizeException(exc, val, tb);
234 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000235}
236
237
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000239PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000241 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000243 *p_type = tstate->curexc_type;
244 *p_value = tstate->curexc_value;
245 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000247 tstate->curexc_type = NULL;
248 tstate->curexc_value = NULL;
249 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250}
251
252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000255 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000257
258/* Convenience functions to set a type error exception and return 0 */
259
260int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000261PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000262{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000263 PyErr_SetString(PyExc_TypeError,
264 "bad argument type for built-in operation");
265 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000266}
267
Guido van Rossum373c8691997-04-29 18:22:47 +0000268PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000270{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000271 if (PyErr_ExceptionMatches(PyExc_MemoryError))
272 /* already current */
273 return NULL;
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000274
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000275 /* raise the pre-allocated instance if it still exists */
276 if (PyExc_MemoryErrorInst)
277 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
278 else
279 /* this will probably fail since there's no memory and hee,
280 hee, we have to instantiate this class
281 */
282 PyErr_SetNone(PyExc_MemoryError);
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000283
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000284 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000285}
286
Guido van Rossum373c8691997-04-29 18:22:47 +0000287PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000288PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000289{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000290 PyObject *v;
291 char *s;
292 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000293#ifdef PLAN9
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000294 char errbuf[ERRMAX];
Martin v. Löwis3484a182002-03-09 12:07:51 +0000295#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000296#ifdef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000297 char *s_buf = NULL;
298 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000299#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000300#ifdef EINTR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000301 if (i == EINTR && PyErr_CheckSignals())
302 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000303#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000304#ifdef PLAN9
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000305 rerrstr(errbuf, sizeof errbuf);
306 s = errbuf;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000307#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000308 if (i == 0)
309 s = "Error"; /* Sometimes errno didn't get set */
310 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000311#ifndef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000312 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000313#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000314 {
315 /* Note that the Win32 errors do not lineup with the
316 errno error. So if the error is in the MSVC error
317 table, we use it, otherwise we assume it really _is_
318 a Win32 error code
319 */
320 if (i > 0 && i < _sys_nerr) {
321 s = _sys_errlist[i];
322 }
323 else {
324 int len = FormatMessage(
325 FORMAT_MESSAGE_ALLOCATE_BUFFER |
326 FORMAT_MESSAGE_FROM_SYSTEM |
327 FORMAT_MESSAGE_IGNORE_INSERTS,
328 NULL, /* no message source */
329 i,
330 MAKELANGID(LANG_NEUTRAL,
331 SUBLANG_DEFAULT),
332 /* Default language */
333 (LPTSTR) &s_buf,
334 0, /* size not used */
335 NULL); /* no args */
336 if (len==0) {
337 /* Only ever seen this in out-of-mem
338 situations */
339 sprintf(s_small_buf, "Windows Error 0x%X", i);
340 s = s_small_buf;
341 s_buf = NULL;
342 } else {
343 s = s_buf;
344 /* remove trailing cr/lf and dots */
345 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
346 s[--len] = '\0';
347 }
348 }
349 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000350#endif /* Unix/Windows */
351#endif /* PLAN 9*/
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000352 if (filenameObject != NULL)
353 v = Py_BuildValue("(isO)", i, s, filenameObject);
354 else
355 v = Py_BuildValue("(is)", i, s);
356 if (v != NULL) {
357 PyErr_SetObject(exc, v);
358 Py_DECREF(v);
359 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000360#ifdef MS_WINDOWS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000361 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000362#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000363 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000364}
Guido van Rossum743007d1999-04-21 15:27:31 +0000365
Barry Warsaw97d95151998-07-23 16:05:56 +0000366
367PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000368PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
369{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000370 PyObject *name = filename ? PyString_FromString(filename) : NULL;
371 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
372 Py_XDECREF(name);
373 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000374}
375
376#ifdef Py_WIN_WIDE_FILENAMES
377PyObject *
378PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
379{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000380 PyObject *name = filename ?
381 PyUnicode_FromUnicode(filename, wcslen(filename)) :
382 NULL;
383 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
384 Py_XDECREF(name);
385 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000386}
387#endif /* Py_WIN_WIDE_FILENAMES */
388
389PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000391{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000392 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000393}
Guido van Rossum683a0721990-10-21 22:09:12 +0000394
Brett Cannonbf364092006-03-01 04:25:17 +0000395#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000396/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000397PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000398 PyObject *exc,
399 int ierr,
400 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000401{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000402 int len;
403 char *s;
404 char *s_buf = NULL; /* Free via LocalFree */
405 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
406 PyObject *v;
407 DWORD err = (DWORD)ierr;
408 if (err==0) err = GetLastError();
409 len = FormatMessage(
410 /* Error API error */
411 FORMAT_MESSAGE_ALLOCATE_BUFFER |
412 FORMAT_MESSAGE_FROM_SYSTEM |
413 FORMAT_MESSAGE_IGNORE_INSERTS,
414 NULL, /* no message source */
415 err,
416 MAKELANGID(LANG_NEUTRAL,
417 SUBLANG_DEFAULT), /* Default language */
418 (LPTSTR) &s_buf,
419 0, /* size not used */
420 NULL); /* no args */
421 if (len==0) {
422 /* Only seen this in out of mem situations */
423 sprintf(s_small_buf, "Windows Error 0x%X", err);
424 s = s_small_buf;
425 s_buf = NULL;
426 } else {
427 s = s_buf;
428 /* remove trailing cr/lf and dots */
429 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
430 s[--len] = '\0';
431 }
432 if (filenameObject != NULL)
433 v = Py_BuildValue("(isO)", err, s, filenameObject);
434 else
435 v = Py_BuildValue("(is)", err, s);
436 if (v != NULL) {
437 PyErr_SetObject(exc, v);
438 Py_DECREF(v);
439 }
440 LocalFree(s_buf);
441 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000442}
443
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000444PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000445 PyObject *exc,
446 int ierr,
447 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000448{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000449 PyObject *name = filename ? PyString_FromString(filename) : NULL;
450 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
451 ierr,
452 name);
453 Py_XDECREF(name);
454 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000455}
456
457#ifdef Py_WIN_WIDE_FILENAMES
458PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000459 PyObject *exc,
460 int ierr,
461 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000462{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000463 PyObject *name = filename ?
464 PyUnicode_FromUnicode(filename, wcslen(filename)) :
465 NULL;
466 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
467 ierr,
468 name);
469 Py_XDECREF(name);
470 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000471}
472#endif /* Py_WIN_WIDE_FILENAMES */
473
Thomas Heller085358a2002-07-29 14:27:41 +0000474PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
475{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000476 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000477}
478
Guido van Rossum795e1892000-02-17 15:19:15 +0000479PyObject *PyErr_SetFromWindowsErr(int ierr)
480{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000481 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
482 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000483}
484PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000485 int ierr,
486 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000487{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000488 PyObject *name = filename ? PyString_FromString(filename) : NULL;
489 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
490 PyExc_WindowsError,
491 ierr, name);
492 Py_XDECREF(name);
493 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000494}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000495
496#ifdef Py_WIN_WIDE_FILENAMES
497PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000498 int ierr,
499 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000500{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000501 PyObject *name = filename ?
502 PyUnicode_FromUnicode(filename, wcslen(filename)) :
503 NULL;
504 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
505 PyExc_WindowsError,
506 ierr, name);
507 Py_XDECREF(name);
508 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000509}
510#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000511#endif /* MS_WINDOWS */
512
Guido van Rossum683a0721990-10-21 22:09:12 +0000513void
Fred Drake6d63adf2000-08-24 22:38:39 +0000514_PyErr_BadInternalCall(char *filename, int lineno)
515{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000516 PyErr_Format(PyExc_SystemError,
517 "%s:%d: bad argument to internal function",
518 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000519}
520
521/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
522 export the entry point for existing object code: */
523#undef PyErr_BadInternalCall
524void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000525PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000526{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000527 PyErr_Format(PyExc_SystemError,
528 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000529}
Fred Drake6d63adf2000-08-24 22:38:39 +0000530#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
531
Guido van Rossum1548bac1997-02-14 17:09:47 +0000532
533
Guido van Rossum1548bac1997-02-14 17:09:47 +0000534PyObject *
535PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000536{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000537 va_list vargs;
538 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000539
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000540#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000541 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000542#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000543 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000544#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000545
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000546 string = PyString_FromFormatV(format, vargs);
547 PyErr_SetObject(exception, string);
548 Py_XDECREF(string);
549 va_end(vargs);
550 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000551}
Guido van Rossum7617e051997-09-16 18:43:50 +0000552
553
Georg Brandl658d5132006-05-23 11:17:21 +0000554
Guido van Rossum7617e051997-09-16 18:43:50 +0000555PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000556PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000557{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000558 char *dot;
559 PyObject *modulename = NULL;
560 PyObject *classname = NULL;
561 PyObject *mydict = NULL;
562 PyObject *bases = NULL;
563 PyObject *result = NULL;
564 dot = strrchr(name, '.');
565 if (dot == NULL) {
566 PyErr_SetString(PyExc_SystemError,
567 "PyErr_NewException: name must be module.class");
568 return NULL;
569 }
570 if (base == NULL)
571 base = PyExc_Exception;
572 if (dict == NULL) {
573 dict = mydict = PyDict_New();
574 if (dict == NULL)
575 goto failure;
576 }
577 if (PyDict_GetItemString(dict, "__module__") == NULL) {
578 modulename = PyString_FromStringAndSize(name,
579 (Py_ssize_t)(dot-name));
580 if (modulename == NULL)
581 goto failure;
582 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
583 goto failure;
584 }
585 if (PyTuple_Check(base)) {
586 bases = base;
587 /* INCREF as we create a new ref in the else branch */
588 Py_INCREF(bases);
589 } else {
590 bases = PyTuple_Pack(1, base);
591 if (bases == NULL)
592 goto failure;
593 }
594 /* Create a real new-style class. */
595 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
596 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000597 failure:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000598 Py_XDECREF(bases);
599 Py_XDECREF(mydict);
600 Py_XDECREF(classname);
601 Py_XDECREF(modulename);
602 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000603}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000604
605/* Call when an exception has occurred but there is no way for Python
606 to handle it. Examples: exception in __del__ or during GC. */
607void
608PyErr_WriteUnraisable(PyObject *obj)
609{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000610 PyObject *f, *t, *v, *tb;
611 PyErr_Fetch(&t, &v, &tb);
612 f = PySys_GetObject("stderr");
613 if (f != NULL) {
614 PyFile_WriteString("Exception ", f);
615 if (t) {
616 PyObject* moduleName;
617 char* className;
618 assert(PyExceptionClass_Check(t));
619 className = PyExceptionClass_Name(t);
620 if (className != NULL) {
621 char *dot = strrchr(className, '.');
622 if (dot != NULL)
623 className = dot+1;
624 }
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000625
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000626 moduleName = PyObject_GetAttrString(t, "__module__");
627 if (moduleName == NULL)
628 PyFile_WriteString("<unknown>", f);
629 else {
630 char* modstr = PyString_AsString(moduleName);
631 if (modstr &&
632 strcmp(modstr, "exceptions") != 0)
633 {
634 PyFile_WriteString(modstr, f);
635 PyFile_WriteString(".", f);
636 }
637 }
638 if (className == NULL)
639 PyFile_WriteString("<unknown>", f);
640 else
641 PyFile_WriteString(className, f);
642 if (v && v != Py_None) {
643 PyFile_WriteString(": ", f);
644 PyFile_WriteObject(v, f, 0);
645 }
646 Py_XDECREF(moduleName);
647 }
648 PyFile_WriteString(" in ", f);
649 PyFile_WriteObject(obj, f, 0);
650 PyFile_WriteString(" ignored\n", f);
651 PyErr_Clear(); /* Just in case */
652 }
653 Py_XDECREF(t);
654 Py_XDECREF(v);
655 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000656}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000657
Armin Rigo092381a2003-10-25 14:29:27 +0000658extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000659
Guido van Rossum2fd45652001-02-28 21:46:24 +0000660
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000661/* Set file and line information for the current exception.
662 If the exception is not a SyntaxError, also sets additional attributes
663 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000664
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000665void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000666PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000667{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000668 PyObject *exc, *v, *tb, *tmp;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000669
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000670 /* add attributes for the line number and filename for the error */
671 PyErr_Fetch(&exc, &v, &tb);
672 PyErr_NormalizeException(&exc, &v, &tb);
673 /* XXX check that it is, indeed, a syntax error. It might not
674 * be, though. */
675 tmp = PyInt_FromLong(lineno);
676 if (tmp == NULL)
677 PyErr_Clear();
678 else {
679 if (PyObject_SetAttrString(v, "lineno", tmp))
680 PyErr_Clear();
681 Py_DECREF(tmp);
682 }
683 if (filename != NULL) {
684 tmp = PyString_FromString(filename);
685 if (tmp == NULL)
686 PyErr_Clear();
687 else {
688 if (PyObject_SetAttrString(v, "filename", tmp))
689 PyErr_Clear();
690 Py_DECREF(tmp);
691 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000692
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000693 tmp = PyErr_ProgramText(filename, lineno);
694 if (tmp) {
695 if (PyObject_SetAttrString(v, "text", tmp))
696 PyErr_Clear();
697 Py_DECREF(tmp);
698 }
699 }
700 if (PyObject_SetAttrString(v, "offset", Py_None)) {
701 PyErr_Clear();
702 }
703 if (exc != PyExc_SyntaxError) {
704 if (!PyObject_HasAttrString(v, "msg")) {
705 tmp = PyObject_Str(v);
706 if (tmp) {
707 if (PyObject_SetAttrString(v, "msg", tmp))
708 PyErr_Clear();
709 Py_DECREF(tmp);
710 } else {
711 PyErr_Clear();
712 }
713 }
714 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
715 if (PyObject_SetAttrString(v, "print_file_and_line",
716 Py_None))
717 PyErr_Clear();
718 }
719 }
720 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000721}
722
723/* com_fetch_program_text will attempt to load the line of text that
724 the exception refers to. If it fails, it will return NULL but will
Brett Cannonbf364092006-03-01 04:25:17 +0000725 not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000726
727 XXX The functionality of this function is quite similar to the
728 functionality in tb_displayline() in traceback.c.
729*/
730
731PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000732PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000733{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000734 FILE *fp;
735 int i;
736 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000737
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000738 if (filename == NULL || *filename == '\0' || lineno <= 0)
739 return NULL;
740 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
741 if (fp == NULL)
742 return NULL;
743 for (i = 0; i < lineno; i++) {
744 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
745 do {
746 *pLastChar = '\0';
747 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
748 break;
749 /* fgets read *something*; if it didn't get as
750 far as pLastChar, it must have found a newline
751 or hit the end of the file; if pLastChar is \n,
752 it obviously found a newline; else we haven't
753 yet seen a newline, so must continue */
754 } while (*pLastChar != '\0' && *pLastChar != '\n');
755 }
756 fclose(fp);
757 if (i == lineno) {
758 char *p = linebuf;
759 while (*p == ' ' || *p == '\t' || *p == '\014')
760 p++;
761 return PyString_FromString(p);
762 }
763 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000764}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000765
766#ifdef __cplusplus
767}
768#endif
769