blob: 90dc729fd1d1f8cb9b95d9f353905a28939bf54b [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
Victor Stinnerbd303c12013-11-07 23:07:29 +010023_Py_IDENTIFIER(builtins);
24_Py_IDENTIFIER(stderr);
25
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000026
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000028PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 PyThreadState *tstate = PyThreadState_GET();
31 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
34 /* XXX Should never happen -- fatal error instead? */
35 /* Well, it could be None. */
36 Py_DECREF(traceback);
37 traceback = NULL;
38 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 /* Save these in locals to safeguard against recursive
41 invocation through Py_XDECREF */
42 oldtype = tstate->curexc_type;
43 oldvalue = tstate->curexc_value;
44 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 tstate->curexc_type = type;
47 tstate->curexc_value = value;
48 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 Py_XDECREF(oldtype);
51 Py_XDECREF(oldvalue);
52 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053}
54
55void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000056PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 PyThreadState *tstate = PyThreadState_GET();
59 PyObject *exc_value;
60 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 if (exception != NULL &&
63 !PyExceptionClass_Check(exception)) {
64 PyErr_Format(PyExc_SystemError,
65 "exception %R not a BaseException subclass",
66 exception);
67 return;
68 }
69 Py_XINCREF(value);
70 exc_value = tstate->exc_value;
71 if (exc_value != NULL && exc_value != Py_None) {
72 /* Implicit exception chaining */
73 Py_INCREF(exc_value);
74 if (value == NULL || !PyExceptionInstance_Check(value)) {
75 /* We must normalize the value right now */
76 PyObject *args, *fixed_value;
Victor Stinnerace47d72013-07-18 01:41:08 +020077#ifdef Py_DEBUG
78 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
79 error if an exception is set when it is called */
80 PyErr_Clear();
81#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 if (value == NULL || value == Py_None)
83 args = PyTuple_New(0);
84 else if (PyTuple_Check(value)) {
85 Py_INCREF(value);
86 args = value;
87 }
88 else
89 args = PyTuple_Pack(1, value);
90 fixed_value = args ?
91 PyEval_CallObject(exception, args) : NULL;
92 Py_XDECREF(args);
93 Py_XDECREF(value);
94 if (fixed_value == NULL)
95 return;
96 value = fixed_value;
97 }
98 /* Avoid reference cycles through the context chain.
99 This is O(chain length) but context chains are
100 usually very short. Sensitive readers may try
101 to inline the call to PyException_GetContext. */
102 if (exc_value != value) {
103 PyObject *o = exc_value, *context;
104 while ((context = PyException_GetContext(o))) {
105 Py_DECREF(context);
106 if (context == value) {
107 PyException_SetContext(o, NULL);
108 break;
109 }
110 o = context;
111 }
112 PyException_SetContext(value, exc_value);
113 } else {
114 Py_DECREF(exc_value);
115 }
116 }
117 if (value != NULL && PyExceptionInstance_Check(value))
118 tb = PyException_GetTraceback(value);
119 Py_XINCREF(exception);
120 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Raymond Hettinger69492da2013-09-02 15:59:26 -0700123/* Set a key error with the specified argument, wrapping it in a
124 * tuple automatically so that tuple keys are not unpacked as the
125 * exception arguments. */
126void
127_PyErr_SetKeyError(PyObject *arg)
128{
129 PyObject *tup;
130 tup = PyTuple_Pack(1, arg);
131 if (!tup)
132 return; /* caller will expect error to be set anyway */
133 PyErr_SetObject(PyExc_KeyError, tup);
134 Py_DECREF(tup);
135}
136
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000138PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
143void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 PyObject *value = PyUnicode_FromString(string);
147 PyErr_SetObject(exception, value);
148 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149}
150
Guido van Rossum3a241811994-08-29 12:14:12 +0000151
Guido van Rossum373c8691997-04-29 18:22:47 +0000152PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000153PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154{
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000155 /* If there is no thread state, PyThreadState_GET calls
156 Py_FatalError, which calls PyErr_Occurred. To avoid the
157 resulting infinite loop, we inline PyThreadState_GET here and
158 treat no thread as no error. */
159 PyThreadState *tstate =
160 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
Guido van Rossuma027efa1997-05-05 20:56:21 +0000161
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000162 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163}
164
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000165
166int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000167PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 if (err == NULL || exc == NULL) {
170 /* maybe caused by "import exceptions" that failed early on */
171 return 0;
172 }
173 if (PyTuple_Check(exc)) {
174 Py_ssize_t i, n;
175 n = PyTuple_Size(exc);
176 for (i = 0; i < n; i++) {
177 /* Test recursively */
178 if (PyErr_GivenExceptionMatches(
179 err, PyTuple_GET_ITEM(exc, i)))
180 {
181 return 1;
182 }
183 }
184 return 0;
185 }
186 /* err might be an instance, so check its class. */
187 if (PyExceptionInstance_Check(err))
188 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
191 int res = 0;
192 PyObject *exception, *value, *tb;
193 PyErr_Fetch(&exception, &value, &tb);
194 /* PyObject_IsSubclass() can recurse and therefore is
195 not safe (see test_bad_getattr in test.pickletester). */
196 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
197 /* This function must not fail, so print the error here */
198 if (res == -1) {
199 PyErr_WriteUnraisable(err);
200 res = 0;
201 }
202 PyErr_Restore(exception, value, tb);
203 return res;
204 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000207}
Guido van Rossum743007d1999-04-21 15:27:31 +0000208
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209
210int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000214}
215
216
217/* Used in many places to normalize a raised exception, including in
218 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000219
220 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000222*/
223void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 PyObject *type = *exc;
227 PyObject *value = *val;
228 PyObject *inclass = NULL;
229 PyObject *initial_tb = NULL;
230 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (type == NULL) {
233 /* There was no exception, so nothing to do. */
234 return;
235 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 /* If PyErr_SetNone() was used, the value will have been actually
238 set to NULL.
239 */
240 if (!value) {
241 value = Py_None;
242 Py_INCREF(value);
243 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 if (PyExceptionInstance_Check(value))
246 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 /* Normalize the exception so that if the type is a class, the
249 value will be an instance.
250 */
251 if (PyExceptionClass_Check(type)) {
Victor Stinner74a7fa62013-07-17 00:44:53 +0200252 int is_subclass;
253 if (inclass) {
254 is_subclass = PyObject_IsSubclass(inclass, type);
255 if (is_subclass < 0)
256 goto finally;
257 }
258 else
259 is_subclass = 0;
260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 /* if the value was not an instance, or is not an instance
262 whose class is (or is derived from) type, then use the
263 value as an argument to instantiation of the type
264 class.
265 */
Victor Stinner74a7fa62013-07-17 00:44:53 +0200266 if (!inclass || !is_subclass) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 if (value == Py_None)
270 args = PyTuple_New(0);
271 else if (PyTuple_Check(value)) {
272 Py_INCREF(value);
273 args = value;
274 }
275 else
276 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 if (args == NULL)
279 goto finally;
280 res = PyEval_CallObject(type, args);
281 Py_DECREF(args);
282 if (res == NULL)
283 goto finally;
284 Py_DECREF(value);
285 value = res;
286 }
287 /* if the class of the instance doesn't exactly match the
288 class of the type, believe the instance
289 */
290 else if (inclass != type) {
291 Py_DECREF(type);
292 type = inclass;
293 Py_INCREF(type);
294 }
295 }
296 *exc = type;
297 *val = value;
298 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000299finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 Py_DECREF(type);
301 Py_DECREF(value);
302 /* If the new exception doesn't set a traceback and the old
303 exception had a traceback, use the old traceback for the
304 new exception. It's better than nothing.
305 */
306 initial_tb = *tb;
307 PyErr_Fetch(exc, val, tb);
308 if (initial_tb != NULL) {
309 if (*tb == NULL)
310 *tb = initial_tb;
311 else
312 Py_DECREF(initial_tb);
313 }
314 /* normalize recursively */
315 tstate = PyThreadState_GET();
316 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
317 --tstate->recursion_depth;
318 /* throw away the old exception... */
319 Py_DECREF(*exc);
320 Py_DECREF(*val);
321 /* ... and use the recursion error instead */
322 *exc = PyExc_RuntimeError;
323 *val = PyExc_RecursionErrorInst;
324 Py_INCREF(*exc);
325 Py_INCREF(*val);
326 /* just keeping the old traceback */
327 return;
328 }
329 PyErr_NormalizeException(exc, val, tb);
330 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000331}
332
333
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 *p_type = tstate->curexc_type;
340 *p_value = tstate->curexc_value;
341 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 tstate->curexc_type = NULL;
344 tstate->curexc_value = NULL;
345 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346}
347
348void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000349PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000353
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200354void
355PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
356{
357 PyThreadState *tstate = PyThreadState_GET();
358
359 *p_type = tstate->exc_type;
360 *p_value = tstate->exc_value;
361 *p_traceback = tstate->exc_traceback;
362
363 Py_XINCREF(*p_type);
364 Py_XINCREF(*p_value);
365 Py_XINCREF(*p_traceback);
366}
367
368void
369PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
370{
371 PyObject *oldtype, *oldvalue, *oldtraceback;
372 PyThreadState *tstate = PyThreadState_GET();
373
374 oldtype = tstate->exc_type;
375 oldvalue = tstate->exc_value;
376 oldtraceback = tstate->exc_traceback;
377
378 tstate->exc_type = p_type;
379 tstate->exc_value = p_value;
380 tstate->exc_traceback = p_traceback;
381
382 Py_XDECREF(oldtype);
383 Py_XDECREF(oldvalue);
384 Py_XDECREF(oldtraceback);
385}
386
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000387/* Convenience functions to set a type error exception and return 0 */
388
389int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 PyErr_SetString(PyExc_TypeError,
393 "bad argument type for built-in operation");
394 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000395}
396
Guido van Rossum373c8691997-04-29 18:22:47 +0000397PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000399{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200400 if (Py_TYPE(PyExc_MemoryError) == NULL) {
401 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
402 initialized by _PyExc_Init() */
403 Py_FatalError("Out of memory and PyExc_MemoryError is not "
404 "initialized yet");
405 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000406 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000408}
409
Guido van Rossum373c8691997-04-29 18:22:47 +0000410PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000411PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200414 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100416#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000418#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000419
Guido van Rossume9fbc091995-02-18 14:52:19 +0000420#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (i == EINTR && PyErr_CheckSignals())
422 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000423#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000424
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000425#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100426 if (i != 0) {
427 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100428 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100429 }
430 else {
431 /* Sometimes errno didn't get set */
432 message = PyUnicode_FromString("Error");
433 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 if (i == 0)
436 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
437 else
438 {
439 /* Note that the Win32 errors do not lineup with the
440 errno error. So if the error is in the MSVC error
441 table, we use it, otherwise we assume it really _is_
442 a Win32 error code
443 */
444 if (i > 0 && i < _sys_nerr) {
445 message = PyUnicode_FromString(_sys_errlist[i]);
446 }
447 else {
448 int len = FormatMessageW(
449 FORMAT_MESSAGE_ALLOCATE_BUFFER |
450 FORMAT_MESSAGE_FROM_SYSTEM |
451 FORMAT_MESSAGE_IGNORE_INSERTS,
452 NULL, /* no message source */
453 i,
454 MAKELANGID(LANG_NEUTRAL,
455 SUBLANG_DEFAULT),
456 /* Default language */
457 (LPWSTR) &s_buf,
458 0, /* size not used */
459 NULL); /* no args */
460 if (len==0) {
461 /* Only ever seen this in out-of-mem
462 situations */
463 s_buf = NULL;
464 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
465 } else {
466 /* remove trailing cr/lf and dots */
467 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
468 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200469 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 }
471 }
472 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000473#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 if (message == NULL)
476 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000477#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 return NULL;
481 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 if (filenameObject != NULL)
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200484 args = Py_BuildValue("(iOO)", i, message, filenameObject);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 else
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200486 args = Py_BuildValue("(iO)", i, message);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000488
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200489 if (args != NULL) {
490 v = PyObject_Call(exc, args, NULL);
491 Py_DECREF(args);
492 if (v != NULL) {
493 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
494 Py_DECREF(v);
495 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000497#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000501}
Guido van Rossum743007d1999-04-21 15:27:31 +0000502
Barry Warsaw97d95151998-07-23 16:05:56 +0000503
504PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000505PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
508 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
509 Py_XDECREF(name);
510 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000511}
512
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000513#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000514PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000515PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 PyObject *name = filename ?
518 PyUnicode_FromUnicode(filename, wcslen(filename)) :
519 NULL;
520 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
521 Py_XDECREF(name);
522 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000523}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000524#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000525
526PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000530}
Guido van Rossum683a0721990-10-21 22:09:12 +0000531
Brett Cannonbf364092006-03-01 04:25:17 +0000532#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000533/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000534PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 PyObject *exc,
536 int ierr,
537 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 int len;
540 WCHAR *s_buf = NULL; /* Free via LocalFree */
541 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200542 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 DWORD err = (DWORD)ierr;
544 if (err==0) err = GetLastError();
545 len = FormatMessageW(
546 /* Error API error */
547 FORMAT_MESSAGE_ALLOCATE_BUFFER |
548 FORMAT_MESSAGE_FROM_SYSTEM |
549 FORMAT_MESSAGE_IGNORE_INSERTS,
550 NULL, /* no message source */
551 err,
552 MAKELANGID(LANG_NEUTRAL,
553 SUBLANG_DEFAULT), /* Default language */
554 (LPWSTR) &s_buf,
555 0, /* size not used */
556 NULL); /* no args */
557 if (len==0) {
558 /* Only seen this in out of mem situations */
559 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
560 s_buf = NULL;
561 } else {
562 /* remove trailing cr/lf and dots */
563 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
564 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200565 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 if (message == NULL)
569 {
570 LocalFree(s_buf);
571 return NULL;
572 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000573
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200574 if (filenameObject == NULL)
575 filenameObject = Py_None;
576 /* This is the constructor signature for passing a Windows error code.
577 The POSIX translation will be figured out by the constructor. */
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200578 args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000580
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200581 if (args != NULL) {
582 v = PyObject_Call(exc, args, NULL);
583 Py_DECREF(args);
584 if (v != NULL) {
585 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
586 Py_DECREF(v);
587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 }
589 LocalFree(s_buf);
590 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000591}
592
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000593PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 PyObject *exc,
595 int ierr,
596 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000597{
Victor Stinner92be9392010-12-28 00:28:21 +0000598 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
600 ierr,
601 name);
602 Py_XDECREF(name);
603 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000604}
605
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000606PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 PyObject *exc,
608 int ierr,
609 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 PyObject *name = filename ?
612 PyUnicode_FromUnicode(filename, wcslen(filename)) :
613 NULL;
614 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
615 ierr,
616 name);
617 Py_XDECREF(name);
618 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000619}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000620
Thomas Heller085358a2002-07-29 14:27:41 +0000621PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000624}
625
Guido van Rossum795e1892000-02-17 15:19:15 +0000626PyObject *PyErr_SetFromWindowsErr(int ierr)
627{
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200628 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000630}
631PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 int ierr,
633 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000634{
Victor Stinner92be9392010-12-28 00:28:21 +0000635 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200637 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 ierr, name);
639 Py_XDECREF(name);
640 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000641}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000642
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000643PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int ierr,
645 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 PyObject *name = filename ?
648 PyUnicode_FromUnicode(filename, wcslen(filename)) :
649 NULL;
650 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200651 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 ierr, name);
653 Py_XDECREF(name);
654 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000655}
Guido van Rossum795e1892000-02-17 15:19:15 +0000656#endif /* MS_WINDOWS */
657
Brett Cannon79ec55e2012-04-12 20:24:54 -0400658PyObject *
Brett Cannon82da8882013-07-04 17:48:16 -0400659PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400660{
Brian Curtin09b86d12012-04-17 16:57:09 -0500661 PyObject *args, *kwargs, *error;
662
Brett Cannon82da8882013-07-04 17:48:16 -0400663 if (msg == NULL)
Brian Curtin94c001b2012-04-18 08:30:51 -0500664 return NULL;
665
Antoine Pitrouec9bac42012-04-18 16:57:54 +0200666 args = PyTuple_New(1);
Brian Curtin09b86d12012-04-17 16:57:09 -0500667 if (args == NULL)
668 return NULL;
669
670 kwargs = PyDict_New();
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400671 if (kwargs == NULL) {
672 Py_DECREF(args);
Brian Curtin09b86d12012-04-17 16:57:09 -0500673 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400674 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500675
Brian Curtin94c001b2012-04-18 08:30:51 -0500676 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500677 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500678 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500679
Brian Curtin94c001b2012-04-18 08:30:51 -0500680 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500681 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500682 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500683
684 Py_INCREF(msg);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400685 PyTuple_SET_ITEM(args, 0, msg);
Victor Stinner479054b2013-07-17 21:54:25 +0200686
687 if (PyDict_SetItemString(kwargs, "name", name) < 0)
688 return NULL;
689 if (PyDict_SetItemString(kwargs, "path", path) < 0)
690 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400691
Brett Cannon82da8882013-07-04 17:48:16 -0400692 error = PyObject_Call(PyExc_ImportError, args, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400693 if (error != NULL) {
694 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500695 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400696 }
697
Brett Cannon79ec55e2012-04-12 20:24:54 -0400698 Py_DECREF(args);
699 Py_DECREF(kwargs);
700
Brian Curtin09b86d12012-04-17 16:57:09 -0500701 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400702}
703
Guido van Rossum683a0721990-10-21 22:09:12 +0000704void
Neal Norwitzb382b842007-08-24 20:00:37 +0000705_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 PyErr_Format(PyExc_SystemError,
708 "%s:%d: bad argument to internal function",
709 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000710}
711
712/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
713 export the entry point for existing object code: */
714#undef PyErr_BadInternalCall
715void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000716PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000717{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200718 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 PyErr_Format(PyExc_SystemError,
720 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000721}
Fred Drake6d63adf2000-08-24 22:38:39 +0000722#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
723
Guido van Rossum1548bac1997-02-14 17:09:47 +0000724
725
Guido van Rossum1548bac1997-02-14 17:09:47 +0000726PyObject *
727PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 va_list vargs;
730 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000731
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000732#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000734#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000736#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000737
Victor Stinnerace47d72013-07-18 01:41:08 +0200738#ifdef Py_DEBUG
739 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
740 if an exception is set when it is called */
741 PyErr_Clear();
742#endif
743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 string = PyUnicode_FromFormatV(format, vargs);
745 PyErr_SetObject(exception, string);
746 Py_XDECREF(string);
747 va_end(vargs);
748 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000749}
Guido van Rossum7617e051997-09-16 18:43:50 +0000750
751
Thomas Wouters477c8d52006-05-27 19:21:47 +0000752
Guido van Rossum7617e051997-09-16 18:43:50 +0000753PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000754PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 const char *dot;
757 PyObject *modulename = NULL;
758 PyObject *classname = NULL;
759 PyObject *mydict = NULL;
760 PyObject *bases = NULL;
761 PyObject *result = NULL;
762 dot = strrchr(name, '.');
763 if (dot == NULL) {
764 PyErr_SetString(PyExc_SystemError,
765 "PyErr_NewException: name must be module.class");
766 return NULL;
767 }
768 if (base == NULL)
769 base = PyExc_Exception;
770 if (dict == NULL) {
771 dict = mydict = PyDict_New();
772 if (dict == NULL)
773 goto failure;
774 }
775 if (PyDict_GetItemString(dict, "__module__") == NULL) {
776 modulename = PyUnicode_FromStringAndSize(name,
777 (Py_ssize_t)(dot-name));
778 if (modulename == NULL)
779 goto failure;
780 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
781 goto failure;
782 }
783 if (PyTuple_Check(base)) {
784 bases = base;
785 /* INCREF as we create a new ref in the else branch */
786 Py_INCREF(bases);
787 } else {
788 bases = PyTuple_Pack(1, base);
789 if (bases == NULL)
790 goto failure;
791 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100792 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000793 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000795 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 Py_XDECREF(bases);
797 Py_XDECREF(mydict);
798 Py_XDECREF(classname);
799 Py_XDECREF(modulename);
800 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000801}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000802
Georg Brandl1e28a272009-12-28 08:41:01 +0000803
804/* Create an exception with docstring */
805PyObject *
806PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 int result;
810 PyObject *ret = NULL;
811 PyObject *mydict = NULL; /* points to the dict only if we create it */
812 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 if (dict == NULL) {
815 dict = mydict = PyDict_New();
816 if (dict == NULL) {
817 return NULL;
818 }
819 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (doc != NULL) {
822 docobj = PyUnicode_FromString(doc);
823 if (docobj == NULL)
824 goto failure;
825 result = PyDict_SetItemString(dict, "__doc__", docobj);
826 Py_DECREF(docobj);
827 if (result < 0)
828 goto failure;
829 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000832 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 Py_XDECREF(mydict);
834 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000835}
836
837
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000838/* Call when an exception has occurred but there is no way for Python
839 to handle it. Examples: exception in __del__ or during GC. */
840void
841PyErr_WriteUnraisable(PyObject *obj)
842{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200843 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *f, *t, *v, *tb;
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200845 PyObject *moduleName = NULL;
846 char* className;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000847
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200848 PyErr_Fetch(&t, &v, &tb);
849
Victor Stinnerbd303c12013-11-07 23:07:29 +0100850 f = _PySys_GetObjectId(&PyId_stderr);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200851 if (f == NULL || f == Py_None)
852 goto done;
853
854 if (obj) {
855 if (PyFile_WriteString("Exception ignored in: ", f) < 0)
856 goto done;
857 if (PyFile_WriteObject(obj, f, 0) < 0)
858 goto done;
859 if (PyFile_WriteString("\n", f) < 0)
860 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200862
863 if (PyTraceBack_Print(tb, f) < 0)
864 goto done;
865
866 if (!t)
867 goto done;
868
869 assert(PyExceptionClass_Check(t));
870 className = PyExceptionClass_Name(t);
871 if (className != NULL) {
872 char *dot = strrchr(className, '.');
873 if (dot != NULL)
874 className = dot+1;
875 }
876
877 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
878 if (moduleName == NULL) {
879 PyErr_Clear();
880 if (PyFile_WriteString("<unknown>", f) < 0)
881 goto done;
882 }
883 else {
Victor Stinnerbd303c12013-11-07 23:07:29 +0100884 if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200885 if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
886 goto done;
887 if (PyFile_WriteString(".", f) < 0)
888 goto done;
889 }
890 }
891 if (className == NULL) {
892 if (PyFile_WriteString("<unknown>", f) < 0)
893 goto done;
894 }
895 else {
896 if (PyFile_WriteString(className, f) < 0)
897 goto done;
898 }
899
900 if (v && v != Py_None) {
901 if (PyFile_WriteString(": ", f) < 0)
902 goto done;
903 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
904 goto done;
905 }
906 if (PyFile_WriteString("\n", f) < 0)
907 goto done;
908
909done:
910 Py_XDECREF(moduleName);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 Py_XDECREF(t);
912 Py_XDECREF(v);
913 Py_XDECREF(tb);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200914 PyErr_Clear(); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000915}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000916
Armin Rigo092381a2003-10-25 14:29:27 +0000917extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000918
Guido van Rossum2fd45652001-02-28 21:46:24 +0000919
Benjamin Peterson2c539712010-09-20 22:42:10 +0000920void
Victor Stinner14e461d2013-08-26 22:28:21 +0200921PyErr_SyntaxLocation(const char *filename, int lineno)
922{
Benjamin Peterson2c539712010-09-20 22:42:10 +0000923 PyErr_SyntaxLocationEx(filename, lineno, -1);
924}
925
926
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000927/* Set file and line information for the current exception.
928 If the exception is not a SyntaxError, also sets additional attributes
929 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000930
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000931void
Victor Stinner14e461d2013-08-26 22:28:21 +0200932PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200935 _Py_IDENTIFIER(filename);
936 _Py_IDENTIFIER(lineno);
937 _Py_IDENTIFIER(msg);
938 _Py_IDENTIFIER(offset);
939 _Py_IDENTIFIER(print_file_and_line);
940 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* add attributes for the line number and filename for the error */
943 PyErr_Fetch(&exc, &v, &tb);
944 PyErr_NormalizeException(&exc, &v, &tb);
945 /* XXX check that it is, indeed, a syntax error. It might not
946 * be, though. */
947 tmp = PyLong_FromLong(lineno);
948 if (tmp == NULL)
949 PyErr_Clear();
950 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200951 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 PyErr_Clear();
953 Py_DECREF(tmp);
954 }
Benjamin Peterson2c539712010-09-20 22:42:10 +0000955 if (col_offset >= 0) {
956 tmp = PyLong_FromLong(col_offset);
957 if (tmp == NULL)
958 PyErr_Clear();
959 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200960 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +0000961 PyErr_Clear();
962 Py_DECREF(tmp);
963 }
964 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 if (filename != NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +0200966 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000968
Victor Stinner14e461d2013-08-26 22:28:21 +0200969 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200971 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_Clear();
973 Py_DECREF(tmp);
974 }
975 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200976 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 PyErr_Clear();
978 }
979 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200980 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 tmp = PyObject_Str(v);
982 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200983 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 PyErr_Clear();
985 Py_DECREF(tmp);
986 } else {
987 PyErr_Clear();
988 }
989 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200990 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
991 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
992 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 PyErr_Clear();
994 }
995 }
996 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000997}
998
Victor Stinner14e461d2013-08-26 22:28:21 +0200999void
1000PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1001{
1002 PyObject *fileobj;
1003 if (filename != NULL) {
1004 fileobj = PyUnicode_DecodeFSDefault(filename);
1005 if (fileobj == NULL)
1006 PyErr_Clear();
1007 }
1008 else
1009 fileobj = NULL;
1010 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1011 Py_XDECREF(fileobj);
1012}
1013
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001014/* Attempt to load the line of text that the exception refers to. If it
1015 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001016
1017 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001018 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001019
Antoine Pitrou409b5382013-10-12 22:41:17 +02001020static PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001021err_programtext(FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 int i;
1024 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 if (fp == NULL)
1027 return NULL;
1028 for (i = 0; i < lineno; i++) {
1029 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1030 do {
1031 *pLastChar = '\0';
1032 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1033 fp, NULL) == NULL)
1034 break;
1035 /* fgets read *something*; if it didn't get as
1036 far as pLastChar, it must have found a newline
1037 or hit the end of the file; if pLastChar is \n,
1038 it obviously found a newline; else we haven't
1039 yet seen a newline, so must continue */
1040 } while (*pLastChar != '\0' && *pLastChar != '\n');
1041 }
1042 fclose(fp);
1043 if (i == lineno) {
1044 char *p = linebuf;
1045 PyObject *res;
1046 while (*p == ' ' || *p == '\t' || *p == '\014')
1047 p++;
1048 res = PyUnicode_FromString(p);
1049 if (res == NULL)
1050 PyErr_Clear();
1051 return res;
1052 }
1053 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001054}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001055
Victor Stinner14e461d2013-08-26 22:28:21 +02001056PyObject *
1057PyErr_ProgramText(const char *filename, int lineno)
1058{
1059 FILE *fp;
1060 if (filename == NULL || *filename == '\0' || lineno <= 0)
1061 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001062 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001063 return err_programtext(fp, lineno);
1064}
1065
1066PyObject *
1067PyErr_ProgramTextObject(PyObject *filename, int lineno)
1068{
1069 FILE *fp;
1070 if (filename == NULL || lineno <= 0)
1071 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001072 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001073 return err_programtext(fp, lineno);
1074}
1075
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001076#ifdef __cplusplus
1077}
1078#endif