blob: 37669739c159d27ce253bf5c0741ac65b23bc533 [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
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000013#include <windows.h>
14#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000015#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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 PyThreadState *tstate = PyThreadState_GET();
28 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +000055 PyThreadState *tstate = PyThreadState_GET();
56 PyObject *exc_value;
57 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 if (exception != NULL &&
60 !PyExceptionClass_Check(exception)) {
61 PyErr_Format(PyExc_SystemError,
62 "exception %R not a BaseException subclass",
63 exception);
64 return;
65 }
66 Py_XINCREF(value);
67 exc_value = tstate->exc_value;
68 if (exc_value != NULL && exc_value != Py_None) {
69 /* Implicit exception chaining */
70 Py_INCREF(exc_value);
71 if (value == NULL || !PyExceptionInstance_Check(value)) {
72 /* We must normalize the value right now */
73 PyObject *args, *fixed_value;
74 if (value == NULL || value == Py_None)
75 args = PyTuple_New(0);
76 else if (PyTuple_Check(value)) {
77 Py_INCREF(value);
78 args = value;
79 }
80 else
81 args = PyTuple_Pack(1, value);
82 fixed_value = args ?
83 PyEval_CallObject(exception, args) : NULL;
84 Py_XDECREF(args);
85 Py_XDECREF(value);
86 if (fixed_value == NULL)
87 return;
88 value = fixed_value;
89 }
90 /* Avoid reference cycles through the context chain.
91 This is O(chain length) but context chains are
92 usually very short. Sensitive readers may try
93 to inline the call to PyException_GetContext. */
94 if (exc_value != value) {
95 PyObject *o = exc_value, *context;
96 while ((context = PyException_GetContext(o))) {
97 Py_DECREF(context);
98 if (context == value) {
99 PyException_SetContext(o, NULL);
100 break;
101 }
102 o = context;
103 }
104 PyException_SetContext(value, exc_value);
105 } else {
106 Py_DECREF(exc_value);
107 }
108 }
109 if (value != NULL && PyExceptionInstance_Check(value))
110 tb = PyException_GetTraceback(value);
111 Py_XINCREF(exception);
112 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113}
114
115void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119}
120
121void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 PyObject *value = PyUnicode_FromString(string);
125 PyErr_SetObject(exception, value);
126 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
Guido van Rossum3a241811994-08-29 12:14:12 +0000129
Guido van Rossum373c8691997-04-29 18:22:47 +0000130PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000133 /* If there is no thread state, PyThreadState_GET calls
134 Py_FatalError, which calls PyErr_Occurred. To avoid the
135 resulting infinite loop, we inline PyThreadState_GET here and
136 treat no thread as no error. */
137 PyThreadState *tstate =
138 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000140 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000143
144int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000145PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (err == NULL || exc == NULL) {
148 /* maybe caused by "import exceptions" that failed early on */
149 return 0;
150 }
151 if (PyTuple_Check(exc)) {
152 Py_ssize_t i, n;
153 n = PyTuple_Size(exc);
154 for (i = 0; i < n; i++) {
155 /* Test recursively */
156 if (PyErr_GivenExceptionMatches(
157 err, PyTuple_GET_ITEM(exc, i)))
158 {
159 return 1;
160 }
161 }
162 return 0;
163 }
164 /* err might be an instance, so check its class. */
165 if (PyExceptionInstance_Check(err))
166 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
169 int res = 0;
170 PyObject *exception, *value, *tb;
171 PyErr_Fetch(&exception, &value, &tb);
172 /* PyObject_IsSubclass() can recurse and therefore is
173 not safe (see test_bad_getattr in test.pickletester). */
174 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
175 /* This function must not fail, so print the error here */
176 if (res == -1) {
177 PyErr_WriteUnraisable(err);
178 res = 0;
179 }
180 PyErr_Restore(exception, value, tb);
181 return res;
182 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000185}
Guido van Rossum743007d1999-04-21 15:27:31 +0000186
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000187
188int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000192}
193
194
195/* Used in many places to normalize a raised exception, including in
196 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000197
198 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000200*/
201void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000202PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyObject *type = *exc;
205 PyObject *value = *val;
206 PyObject *inclass = NULL;
207 PyObject *initial_tb = NULL;
208 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (type == NULL) {
211 /* There was no exception, so nothing to do. */
212 return;
213 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 /* If PyErr_SetNone() was used, the value will have been actually
216 set to NULL.
217 */
218 if (!value) {
219 value = Py_None;
220 Py_INCREF(value);
221 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (PyExceptionInstance_Check(value))
224 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 /* Normalize the exception so that if the type is a class, the
227 value will be an instance.
228 */
229 if (PyExceptionClass_Check(type)) {
230 /* if the value was not an instance, or is not an instance
231 whose class is (or is derived from) type, then use the
232 value as an argument to instantiation of the type
233 class.
234 */
235 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
236 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (value == Py_None)
239 args = PyTuple_New(0);
240 else if (PyTuple_Check(value)) {
241 Py_INCREF(value);
242 args = value;
243 }
244 else
245 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 if (args == NULL)
248 goto finally;
249 res = PyEval_CallObject(type, args);
250 Py_DECREF(args);
251 if (res == NULL)
252 goto finally;
253 Py_DECREF(value);
254 value = res;
255 }
256 /* if the class of the instance doesn't exactly match the
257 class of the type, believe the instance
258 */
259 else if (inclass != type) {
260 Py_DECREF(type);
261 type = inclass;
262 Py_INCREF(type);
263 }
264 }
265 *exc = type;
266 *val = value;
267 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000268finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 Py_DECREF(type);
270 Py_DECREF(value);
271 /* If the new exception doesn't set a traceback and the old
272 exception had a traceback, use the old traceback for the
273 new exception. It's better than nothing.
274 */
275 initial_tb = *tb;
276 PyErr_Fetch(exc, val, tb);
277 if (initial_tb != NULL) {
278 if (*tb == NULL)
279 *tb = initial_tb;
280 else
281 Py_DECREF(initial_tb);
282 }
283 /* normalize recursively */
284 tstate = PyThreadState_GET();
285 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
286 --tstate->recursion_depth;
287 /* throw away the old exception... */
288 Py_DECREF(*exc);
289 Py_DECREF(*val);
290 /* ... and use the recursion error instead */
291 *exc = PyExc_RuntimeError;
292 *val = PyExc_RecursionErrorInst;
293 Py_INCREF(*exc);
294 Py_INCREF(*val);
295 /* just keeping the old traceback */
296 return;
297 }
298 PyErr_NormalizeException(exc, val, tb);
299 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000300}
301
302
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 *p_type = tstate->curexc_type;
309 *p_value = tstate->curexc_value;
310 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 tstate->curexc_type = NULL;
313 tstate->curexc_value = NULL;
314 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
317void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000318PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000322
323/* Convenience functions to set a type error exception and return 0 */
324
325int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000326PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 PyErr_SetString(PyExc_TypeError,
329 "bad argument type for built-in operation");
330 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000331}
332
Guido van Rossum373c8691997-04-29 18:22:47 +0000333PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 if (PyErr_ExceptionMatches(PyExc_MemoryError))
337 /* already current */
338 return NULL;
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 /* raise the pre-allocated instance if it still exists */
341 if (PyExc_MemoryErrorInst)
342 {
343 /* Clear the previous traceback, otherwise it will be appended
344 * to the current one.
345 *
346 * The following statement is not likely to raise any error;
347 * if it does, we simply discard it.
348 */
349 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
352 }
353 else
354 /* this will probably fail since there's no memory and hee,
355 hee, we have to instantiate this class
356 */
357 PyErr_SetNone(PyExc_MemoryError);
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000360}
361
Guido van Rossum373c8691997-04-29 18:22:47 +0000362PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000363PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 PyObject *message;
366 PyObject *v;
367 int i = errno;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000368#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 char *s;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000370#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000372#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000373
Guido van Rossume9fbc091995-02-18 14:52:19 +0000374#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 if (i == EINTR && PyErr_CheckSignals())
376 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000377#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000378
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000379#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 if (i == 0)
381 s = "Error"; /* Sometimes errno didn't get set */
382 else
383 s = strerror(i);
384 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000385#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 if (i == 0)
387 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
388 else
389 {
390 /* Note that the Win32 errors do not lineup with the
391 errno error. So if the error is in the MSVC error
392 table, we use it, otherwise we assume it really _is_
393 a Win32 error code
394 */
395 if (i > 0 && i < _sys_nerr) {
396 message = PyUnicode_FromString(_sys_errlist[i]);
397 }
398 else {
399 int len = FormatMessageW(
400 FORMAT_MESSAGE_ALLOCATE_BUFFER |
401 FORMAT_MESSAGE_FROM_SYSTEM |
402 FORMAT_MESSAGE_IGNORE_INSERTS,
403 NULL, /* no message source */
404 i,
405 MAKELANGID(LANG_NEUTRAL,
406 SUBLANG_DEFAULT),
407 /* Default language */
408 (LPWSTR) &s_buf,
409 0, /* size not used */
410 NULL); /* no args */
411 if (len==0) {
412 /* Only ever seen this in out-of-mem
413 situations */
414 s_buf = NULL;
415 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
416 } else {
417 /* remove trailing cr/lf and dots */
418 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
419 s_buf[--len] = L'\0';
420 message = PyUnicode_FromUnicode(s_buf, len);
421 }
422 }
423 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000424#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 if (message == NULL)
427 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000428#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 return NULL;
432 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 if (filenameObject != NULL)
435 v = Py_BuildValue("(iOO)", i, message, filenameObject);
436 else
437 v = Py_BuildValue("(iO)", i, message);
438 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 if (v != NULL) {
441 PyErr_SetObject(exc, v);
442 Py_DECREF(v);
443 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000444#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000448}
Guido van Rossum743007d1999-04-21 15:27:31 +0000449
Barry Warsaw97d95151998-07-23 16:05:56 +0000450
451PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000452PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
455 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
456 Py_XDECREF(name);
457 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000458}
459
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000460#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000461PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000462PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyObject *name = filename ?
465 PyUnicode_FromUnicode(filename, wcslen(filename)) :
466 NULL;
467 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
468 Py_XDECREF(name);
469 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000470}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000471#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000472
473PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000477}
Guido van Rossum683a0721990-10-21 22:09:12 +0000478
Brett Cannonbf364092006-03-01 04:25:17 +0000479#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000480/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000481PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 PyObject *exc,
483 int ierr,
484 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 int len;
487 WCHAR *s_buf = NULL; /* Free via LocalFree */
488 PyObject *message;
489 PyObject *v;
490 DWORD err = (DWORD)ierr;
491 if (err==0) err = GetLastError();
492 len = FormatMessageW(
493 /* Error API error */
494 FORMAT_MESSAGE_ALLOCATE_BUFFER |
495 FORMAT_MESSAGE_FROM_SYSTEM |
496 FORMAT_MESSAGE_IGNORE_INSERTS,
497 NULL, /* no message source */
498 err,
499 MAKELANGID(LANG_NEUTRAL,
500 SUBLANG_DEFAULT), /* Default language */
501 (LPWSTR) &s_buf,
502 0, /* size not used */
503 NULL); /* no args */
504 if (len==0) {
505 /* Only seen this in out of mem situations */
506 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
507 s_buf = NULL;
508 } else {
509 /* remove trailing cr/lf and dots */
510 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
511 s_buf[--len] = L'\0';
512 message = PyUnicode_FromUnicode(s_buf, len);
513 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 if (message == NULL)
516 {
517 LocalFree(s_buf);
518 return NULL;
519 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 if (filenameObject != NULL)
522 v = Py_BuildValue("(iOO)", err, message, filenameObject);
523 else
524 v = Py_BuildValue("(iO)", err, message);
525 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (v != NULL) {
528 PyErr_SetObject(exc, v);
529 Py_DECREF(v);
530 }
531 LocalFree(s_buf);
532 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000533}
534
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000535PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 PyObject *exc,
537 int ierr,
538 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
541 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
542 ierr,
543 name);
544 Py_XDECREF(name);
545 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000546}
547
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000548PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 PyObject *exc,
550 int ierr,
551 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 PyObject *name = filename ?
554 PyUnicode_FromUnicode(filename, wcslen(filename)) :
555 NULL;
556 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
557 ierr,
558 name);
559 Py_XDECREF(name);
560 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000561}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000562
Thomas Heller085358a2002-07-29 14:27:41 +0000563PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000566}
567
Guido van Rossum795e1892000-02-17 15:19:15 +0000568PyObject *PyErr_SetFromWindowsErr(int ierr)
569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
571 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000572}
573PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 int ierr,
575 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
578 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
579 PyExc_WindowsError,
580 ierr, name);
581 Py_XDECREF(name);
582 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000583}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000584
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000585PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 int ierr,
587 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 PyObject *name = filename ?
590 PyUnicode_FromUnicode(filename, wcslen(filename)) :
591 NULL;
592 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
593 PyExc_WindowsError,
594 ierr, name);
595 Py_XDECREF(name);
596 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000597}
Guido van Rossum795e1892000-02-17 15:19:15 +0000598#endif /* MS_WINDOWS */
599
Guido van Rossum683a0721990-10-21 22:09:12 +0000600void
Neal Norwitzb382b842007-08-24 20:00:37 +0000601_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 PyErr_Format(PyExc_SystemError,
604 "%s:%d: bad argument to internal function",
605 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000606}
607
608/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
609 export the entry point for existing object code: */
610#undef PyErr_BadInternalCall
611void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 PyErr_Format(PyExc_SystemError,
615 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000616}
Fred Drake6d63adf2000-08-24 22:38:39 +0000617#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
618
Guido van Rossum1548bac1997-02-14 17:09:47 +0000619
620
Guido van Rossum1548bac1997-02-14 17:09:47 +0000621PyObject *
622PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 va_list vargs;
625 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000626
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000627#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000631#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 string = PyUnicode_FromFormatV(format, vargs);
634 PyErr_SetObject(exception, string);
635 Py_XDECREF(string);
636 va_end(vargs);
637 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000638}
Guido van Rossum7617e051997-09-16 18:43:50 +0000639
640
Thomas Wouters477c8d52006-05-27 19:21:47 +0000641
Guido van Rossum7617e051997-09-16 18:43:50 +0000642PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000643PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 const char *dot;
646 PyObject *modulename = NULL;
647 PyObject *classname = NULL;
648 PyObject *mydict = NULL;
649 PyObject *bases = NULL;
650 PyObject *result = NULL;
651 dot = strrchr(name, '.');
652 if (dot == NULL) {
653 PyErr_SetString(PyExc_SystemError,
654 "PyErr_NewException: name must be module.class");
655 return NULL;
656 }
657 if (base == NULL)
658 base = PyExc_Exception;
659 if (dict == NULL) {
660 dict = mydict = PyDict_New();
661 if (dict == NULL)
662 goto failure;
663 }
664 if (PyDict_GetItemString(dict, "__module__") == NULL) {
665 modulename = PyUnicode_FromStringAndSize(name,
666 (Py_ssize_t)(dot-name));
667 if (modulename == NULL)
668 goto failure;
669 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
670 goto failure;
671 }
672 if (PyTuple_Check(base)) {
673 bases = base;
674 /* INCREF as we create a new ref in the else branch */
675 Py_INCREF(bases);
676 } else {
677 bases = PyTuple_Pack(1, base);
678 if (bases == NULL)
679 goto failure;
680 }
681 /* Create a real new-style class. */
682 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
683 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000684 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 Py_XDECREF(bases);
686 Py_XDECREF(mydict);
687 Py_XDECREF(classname);
688 Py_XDECREF(modulename);
689 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000690}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000691
Georg Brandl1e28a272009-12-28 08:41:01 +0000692
693/* Create an exception with docstring */
694PyObject *
695PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 int result;
699 PyObject *ret = NULL;
700 PyObject *mydict = NULL; /* points to the dict only if we create it */
701 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 if (dict == NULL) {
704 dict = mydict = PyDict_New();
705 if (dict == NULL) {
706 return NULL;
707 }
708 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (doc != NULL) {
711 docobj = PyUnicode_FromString(doc);
712 if (docobj == NULL)
713 goto failure;
714 result = PyDict_SetItemString(dict, "__doc__", docobj);
715 Py_DECREF(docobj);
716 if (result < 0)
717 goto failure;
718 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000721 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 Py_XDECREF(mydict);
723 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000724}
725
726
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000727/* Call when an exception has occurred but there is no way for Python
728 to handle it. Examples: exception in __del__ or during GC. */
729void
730PyErr_WriteUnraisable(PyObject *obj)
731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 PyObject *f, *t, *v, *tb;
733 PyErr_Fetch(&t, &v, &tb);
734 f = PySys_GetObject("stderr");
735 if (f != NULL && f != Py_None) {
736 PyFile_WriteString("Exception ", f);
737 if (t) {
738 PyObject* moduleName;
739 char* className;
740 assert(PyExceptionClass_Check(t));
741 className = PyExceptionClass_Name(t);
742 if (className != NULL) {
743 char *dot = strrchr(className, '.');
744 if (dot != NULL)
745 className = dot+1;
746 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 moduleName = PyObject_GetAttrString(t, "__module__");
749 if (moduleName == NULL)
750 PyFile_WriteString("<unknown>", f);
751 else {
752 char* modstr = _PyUnicode_AsString(moduleName);
753 if (modstr &&
754 strcmp(modstr, "builtins") != 0)
755 {
756 PyFile_WriteString(modstr, f);
757 PyFile_WriteString(".", f);
758 }
759 }
760 if (className == NULL)
761 PyFile_WriteString("<unknown>", f);
762 else
763 PyFile_WriteString(className, f);
764 if (v && v != Py_None) {
765 PyFile_WriteString(": ", f);
766 PyFile_WriteObject(v, f, 0);
767 }
768 Py_XDECREF(moduleName);
769 }
770 PyFile_WriteString(" in ", f);
771 PyFile_WriteObject(obj, f, 0);
772 PyFile_WriteString(" ignored\n", f);
773 PyErr_Clear(); /* Just in case */
774 }
775 Py_XDECREF(t);
776 Py_XDECREF(v);
777 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000778}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000779
Armin Rigo092381a2003-10-25 14:29:27 +0000780extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000781
Guido van Rossum2fd45652001-02-28 21:46:24 +0000782
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000783/* Set file and line information for the current exception.
784 If the exception is not a SyntaxError, also sets additional attributes
785 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000786
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000787void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000788PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 PyObject *exc, *v, *tb, *tmp;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 /* add attributes for the line number and filename for the error */
793 PyErr_Fetch(&exc, &v, &tb);
794 PyErr_NormalizeException(&exc, &v, &tb);
795 /* XXX check that it is, indeed, a syntax error. It might not
796 * be, though. */
797 tmp = PyLong_FromLong(lineno);
798 if (tmp == NULL)
799 PyErr_Clear();
800 else {
801 if (PyObject_SetAttrString(v, "lineno", tmp))
802 PyErr_Clear();
803 Py_DECREF(tmp);
804 }
805 if (filename != NULL) {
806 tmp = PyUnicode_FromString(filename);
807 if (tmp == NULL)
808 PyErr_Clear();
809 else {
810 if (PyObject_SetAttrString(v, "filename", tmp))
811 PyErr_Clear();
812 Py_DECREF(tmp);
813 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 tmp = PyErr_ProgramText(filename, lineno);
816 if (tmp) {
817 if (PyObject_SetAttrString(v, "text", tmp))
818 PyErr_Clear();
819 Py_DECREF(tmp);
820 }
821 }
822 if (PyObject_SetAttrString(v, "offset", Py_None)) {
823 PyErr_Clear();
824 }
825 if (exc != PyExc_SyntaxError) {
826 if (!PyObject_HasAttrString(v, "msg")) {
827 tmp = PyObject_Str(v);
828 if (tmp) {
829 if (PyObject_SetAttrString(v, "msg", tmp))
830 PyErr_Clear();
831 Py_DECREF(tmp);
832 } else {
833 PyErr_Clear();
834 }
835 }
836 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
837 if (PyObject_SetAttrString(v, "print_file_and_line",
838 Py_None))
839 PyErr_Clear();
840 }
841 }
842 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000843}
844
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000845/* Attempt to load the line of text that the exception refers to. If it
846 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000847
848 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000849 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000850
851PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000852PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 FILE *fp;
855 int i;
856 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 if (filename == NULL || *filename == '\0' || lineno <= 0)
859 return NULL;
860 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
861 if (fp == NULL)
862 return NULL;
863 for (i = 0; i < lineno; i++) {
864 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
865 do {
866 *pLastChar = '\0';
867 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
868 fp, NULL) == NULL)
869 break;
870 /* fgets read *something*; if it didn't get as
871 far as pLastChar, it must have found a newline
872 or hit the end of the file; if pLastChar is \n,
873 it obviously found a newline; else we haven't
874 yet seen a newline, so must continue */
875 } while (*pLastChar != '\0' && *pLastChar != '\n');
876 }
877 fclose(fp);
878 if (i == lineno) {
879 char *p = linebuf;
880 PyObject *res;
881 while (*p == ' ' || *p == '\t' || *p == '\014')
882 p++;
883 res = PyUnicode_FromString(p);
884 if (res == NULL)
885 PyErr_Clear();
886 return res;
887 }
888 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000889}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000890
891#ifdef __cplusplus
892}
893#endif