blob: 1832b5b60224c52be43e8af379d51dd0d911b470 [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;
Victor Stinnerace47d72013-07-18 01:41:08 +020074#ifdef Py_DEBUG
75 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
76 error if an exception is set when it is called */
77 PyErr_Clear();
78#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 if (value == NULL || value == Py_None)
80 args = PyTuple_New(0);
81 else if (PyTuple_Check(value)) {
82 Py_INCREF(value);
83 args = value;
84 }
85 else
86 args = PyTuple_Pack(1, value);
87 fixed_value = args ?
88 PyEval_CallObject(exception, args) : NULL;
89 Py_XDECREF(args);
90 Py_XDECREF(value);
91 if (fixed_value == NULL)
92 return;
93 value = fixed_value;
94 }
95 /* Avoid reference cycles through the context chain.
96 This is O(chain length) but context chains are
97 usually very short. Sensitive readers may try
98 to inline the call to PyException_GetContext. */
99 if (exc_value != value) {
100 PyObject *o = exc_value, *context;
101 while ((context = PyException_GetContext(o))) {
102 Py_DECREF(context);
103 if (context == value) {
104 PyException_SetContext(o, NULL);
105 break;
106 }
107 o = context;
108 }
109 PyException_SetContext(value, exc_value);
110 } else {
111 Py_DECREF(exc_value);
112 }
113 }
114 if (value != NULL && PyExceptionInstance_Check(value))
115 tb = PyException_GetTraceback(value);
116 Py_XINCREF(exception);
117 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118}
119
Raymond Hettinger69492da2013-09-02 15:59:26 -0700120/* Set a key error with the specified argument, wrapping it in a
121 * tuple automatically so that tuple keys are not unpacked as the
122 * exception arguments. */
123void
124_PyErr_SetKeyError(PyObject *arg)
125{
126 PyObject *tup;
127 tup = PyTuple_Pack(1, arg);
128 if (!tup)
129 return; /* caller will expect error to be set anyway */
130 PyErr_SetObject(PyExc_KeyError, tup);
131 Py_DECREF(tup);
132}
133
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138}
139
140void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000141PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 PyObject *value = PyUnicode_FromString(string);
144 PyErr_SetObject(exception, value);
145 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146}
147
Guido van Rossum3a241811994-08-29 12:14:12 +0000148
Guido van Rossum373c8691997-04-29 18:22:47 +0000149PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000150PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151{
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000152 /* If there is no thread state, PyThreadState_GET calls
153 Py_FatalError, which calls PyErr_Occurred. To avoid the
154 resulting infinite loop, we inline PyThreadState_GET here and
155 treat no thread as no error. */
156 PyThreadState *tstate =
157 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
Guido van Rossuma027efa1997-05-05 20:56:21 +0000158
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000159 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160}
161
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000162
163int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000164PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 if (err == NULL || exc == NULL) {
167 /* maybe caused by "import exceptions" that failed early on */
168 return 0;
169 }
170 if (PyTuple_Check(exc)) {
171 Py_ssize_t i, n;
172 n = PyTuple_Size(exc);
173 for (i = 0; i < n; i++) {
174 /* Test recursively */
175 if (PyErr_GivenExceptionMatches(
176 err, PyTuple_GET_ITEM(exc, i)))
177 {
178 return 1;
179 }
180 }
181 return 0;
182 }
183 /* err might be an instance, so check its class. */
184 if (PyExceptionInstance_Check(err))
185 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
188 int res = 0;
189 PyObject *exception, *value, *tb;
190 PyErr_Fetch(&exception, &value, &tb);
191 /* PyObject_IsSubclass() can recurse and therefore is
192 not safe (see test_bad_getattr in test.pickletester). */
193 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
194 /* This function must not fail, so print the error here */
195 if (res == -1) {
196 PyErr_WriteUnraisable(err);
197 res = 0;
198 }
199 PyErr_Restore(exception, value, tb);
200 return res;
201 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000204}
Guido van Rossum743007d1999-04-21 15:27:31 +0000205
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000206
207int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000208PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000211}
212
213
214/* Used in many places to normalize a raised exception, including in
215 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000216
217 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000219*/
220void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyObject *type = *exc;
224 PyObject *value = *val;
225 PyObject *inclass = NULL;
226 PyObject *initial_tb = NULL;
227 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (type == NULL) {
230 /* There was no exception, so nothing to do. */
231 return;
232 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 /* If PyErr_SetNone() was used, the value will have been actually
235 set to NULL.
236 */
237 if (!value) {
238 value = Py_None;
239 Py_INCREF(value);
240 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (PyExceptionInstance_Check(value))
243 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 /* Normalize the exception so that if the type is a class, the
246 value will be an instance.
247 */
248 if (PyExceptionClass_Check(type)) {
Victor Stinner74a7fa62013-07-17 00:44:53 +0200249 int is_subclass;
250 if (inclass) {
251 is_subclass = PyObject_IsSubclass(inclass, type);
252 if (is_subclass < 0)
253 goto finally;
254 }
255 else
256 is_subclass = 0;
257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 /* if the value was not an instance, or is not an instance
259 whose class is (or is derived from) type, then use the
260 value as an argument to instantiation of the type
261 class.
262 */
Victor Stinner74a7fa62013-07-17 00:44:53 +0200263 if (!inclass || !is_subclass) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 if (value == Py_None)
267 args = PyTuple_New(0);
268 else if (PyTuple_Check(value)) {
269 Py_INCREF(value);
270 args = value;
271 }
272 else
273 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 if (args == NULL)
276 goto finally;
277 res = PyEval_CallObject(type, args);
278 Py_DECREF(args);
279 if (res == NULL)
280 goto finally;
281 Py_DECREF(value);
282 value = res;
283 }
284 /* if the class of the instance doesn't exactly match the
285 class of the type, believe the instance
286 */
287 else if (inclass != type) {
288 Py_DECREF(type);
289 type = inclass;
290 Py_INCREF(type);
291 }
292 }
293 *exc = type;
294 *val = value;
295 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000296finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_DECREF(type);
298 Py_DECREF(value);
299 /* If the new exception doesn't set a traceback and the old
300 exception had a traceback, use the old traceback for the
301 new exception. It's better than nothing.
302 */
303 initial_tb = *tb;
304 PyErr_Fetch(exc, val, tb);
305 if (initial_tb != NULL) {
306 if (*tb == NULL)
307 *tb = initial_tb;
308 else
309 Py_DECREF(initial_tb);
310 }
311 /* normalize recursively */
312 tstate = PyThreadState_GET();
313 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
314 --tstate->recursion_depth;
315 /* throw away the old exception... */
316 Py_DECREF(*exc);
317 Py_DECREF(*val);
318 /* ... and use the recursion error instead */
319 *exc = PyExc_RuntimeError;
320 *val = PyExc_RecursionErrorInst;
321 Py_INCREF(*exc);
322 Py_INCREF(*val);
323 /* just keeping the old traceback */
324 return;
325 }
326 PyErr_NormalizeException(exc, val, tb);
327 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000328}
329
330
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 *p_type = tstate->curexc_type;
337 *p_value = tstate->curexc_value;
338 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 tstate->curexc_type = NULL;
341 tstate->curexc_value = NULL;
342 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
345void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000346PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000350
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200351void
352PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
353{
354 PyThreadState *tstate = PyThreadState_GET();
355
356 *p_type = tstate->exc_type;
357 *p_value = tstate->exc_value;
358 *p_traceback = tstate->exc_traceback;
359
360 Py_XINCREF(*p_type);
361 Py_XINCREF(*p_value);
362 Py_XINCREF(*p_traceback);
363}
364
365void
366PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
367{
368 PyObject *oldtype, *oldvalue, *oldtraceback;
369 PyThreadState *tstate = PyThreadState_GET();
370
371 oldtype = tstate->exc_type;
372 oldvalue = tstate->exc_value;
373 oldtraceback = tstate->exc_traceback;
374
375 tstate->exc_type = p_type;
376 tstate->exc_value = p_value;
377 tstate->exc_traceback = p_traceback;
378
379 Py_XDECREF(oldtype);
380 Py_XDECREF(oldvalue);
381 Py_XDECREF(oldtraceback);
382}
383
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000384/* Convenience functions to set a type error exception and return 0 */
385
386int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyErr_SetString(PyExc_TypeError,
390 "bad argument type for built-in operation");
391 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000392}
393
Guido van Rossum373c8691997-04-29 18:22:47 +0000394PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000395PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000396{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200397 if (Py_TYPE(PyExc_MemoryError) == NULL) {
398 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
399 initialized by _PyExc_Init() */
400 Py_FatalError("Out of memory and PyExc_MemoryError is not "
401 "initialized yet");
402 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000403 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000405}
406
Guido van Rossum373c8691997-04-29 18:22:47 +0000407PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000408PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200411 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100413#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000415#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000416
Guido van Rossume9fbc091995-02-18 14:52:19 +0000417#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 if (i == EINTR && PyErr_CheckSignals())
419 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000420#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000421
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000422#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100423 if (i != 0) {
424 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100425 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100426 }
427 else {
428 /* Sometimes errno didn't get set */
429 message = PyUnicode_FromString("Error");
430 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000431#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 if (i == 0)
433 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
434 else
435 {
436 /* Note that the Win32 errors do not lineup with the
437 errno error. So if the error is in the MSVC error
438 table, we use it, otherwise we assume it really _is_
439 a Win32 error code
440 */
441 if (i > 0 && i < _sys_nerr) {
442 message = PyUnicode_FromString(_sys_errlist[i]);
443 }
444 else {
445 int len = FormatMessageW(
446 FORMAT_MESSAGE_ALLOCATE_BUFFER |
447 FORMAT_MESSAGE_FROM_SYSTEM |
448 FORMAT_MESSAGE_IGNORE_INSERTS,
449 NULL, /* no message source */
450 i,
451 MAKELANGID(LANG_NEUTRAL,
452 SUBLANG_DEFAULT),
453 /* Default language */
454 (LPWSTR) &s_buf,
455 0, /* size not used */
456 NULL); /* no args */
457 if (len==0) {
458 /* Only ever seen this in out-of-mem
459 situations */
460 s_buf = NULL;
461 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
462 } else {
463 /* remove trailing cr/lf and dots */
464 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
465 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200466 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 }
468 }
469 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000470#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 if (message == NULL)
473 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000474#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return NULL;
478 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 if (filenameObject != NULL)
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200481 args = Py_BuildValue("(iOO)", i, message, filenameObject);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 else
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200483 args = Py_BuildValue("(iO)", i, message);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000485
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200486 if (args != NULL) {
487 v = PyObject_Call(exc, args, NULL);
488 Py_DECREF(args);
489 if (v != NULL) {
490 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
491 Py_DECREF(v);
492 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000494#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000498}
Guido van Rossum743007d1999-04-21 15:27:31 +0000499
Barry Warsaw97d95151998-07-23 16:05:56 +0000500
501PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000502PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
505 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
506 Py_XDECREF(name);
507 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000508}
509
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000510#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000511PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000512PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 PyObject *name = filename ?
515 PyUnicode_FromUnicode(filename, wcslen(filename)) :
516 NULL;
517 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
518 Py_XDECREF(name);
519 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000520}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000521#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000522
523PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000524PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000527}
Guido van Rossum683a0721990-10-21 22:09:12 +0000528
Brett Cannonbf364092006-03-01 04:25:17 +0000529#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000530/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000531PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *exc,
533 int ierr,
534 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 int len;
537 WCHAR *s_buf = NULL; /* Free via LocalFree */
538 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200539 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 DWORD err = (DWORD)ierr;
541 if (err==0) err = GetLastError();
542 len = FormatMessageW(
543 /* Error API error */
544 FORMAT_MESSAGE_ALLOCATE_BUFFER |
545 FORMAT_MESSAGE_FROM_SYSTEM |
546 FORMAT_MESSAGE_IGNORE_INSERTS,
547 NULL, /* no message source */
548 err,
549 MAKELANGID(LANG_NEUTRAL,
550 SUBLANG_DEFAULT), /* Default language */
551 (LPWSTR) &s_buf,
552 0, /* size not used */
553 NULL); /* no args */
554 if (len==0) {
555 /* Only seen this in out of mem situations */
556 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
557 s_buf = NULL;
558 } else {
559 /* remove trailing cr/lf and dots */
560 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
561 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200562 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 if (message == NULL)
566 {
567 LocalFree(s_buf);
568 return NULL;
569 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000570
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200571 if (filenameObject == NULL)
572 filenameObject = Py_None;
573 /* This is the constructor signature for passing a Windows error code.
574 The POSIX translation will be figured out by the constructor. */
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200575 args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000577
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200578 if (args != NULL) {
579 v = PyObject_Call(exc, args, NULL);
580 Py_DECREF(args);
581 if (v != NULL) {
582 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
583 Py_DECREF(v);
584 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 }
586 LocalFree(s_buf);
587 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000588}
589
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000590PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 PyObject *exc,
592 int ierr,
593 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000594{
Victor Stinner92be9392010-12-28 00:28:21 +0000595 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
597 ierr,
598 name);
599 Py_XDECREF(name);
600 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000601}
602
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000603PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 PyObject *exc,
605 int ierr,
606 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 PyObject *name = filename ?
609 PyUnicode_FromUnicode(filename, wcslen(filename)) :
610 NULL;
611 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
612 ierr,
613 name);
614 Py_XDECREF(name);
615 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000616}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000617
Thomas Heller085358a2002-07-29 14:27:41 +0000618PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000621}
622
Guido van Rossum795e1892000-02-17 15:19:15 +0000623PyObject *PyErr_SetFromWindowsErr(int ierr)
624{
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200625 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000627}
628PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 int ierr,
630 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000631{
Victor Stinner92be9392010-12-28 00:28:21 +0000632 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200634 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 ierr, name);
636 Py_XDECREF(name);
637 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000638}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000639
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000640PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 int ierr,
642 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 PyObject *name = filename ?
645 PyUnicode_FromUnicode(filename, wcslen(filename)) :
646 NULL;
647 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200648 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 ierr, name);
650 Py_XDECREF(name);
651 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000652}
Guido van Rossum795e1892000-02-17 15:19:15 +0000653#endif /* MS_WINDOWS */
654
Brett Cannon79ec55e2012-04-12 20:24:54 -0400655PyObject *
Brett Cannon82da8882013-07-04 17:48:16 -0400656PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400657{
Brian Curtin09b86d12012-04-17 16:57:09 -0500658 PyObject *args, *kwargs, *error;
659
Brett Cannon82da8882013-07-04 17:48:16 -0400660 if (msg == NULL)
Brian Curtin94c001b2012-04-18 08:30:51 -0500661 return NULL;
662
Antoine Pitrouec9bac42012-04-18 16:57:54 +0200663 args = PyTuple_New(1);
Brian Curtin09b86d12012-04-17 16:57:09 -0500664 if (args == NULL)
665 return NULL;
666
667 kwargs = PyDict_New();
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400668 if (kwargs == NULL) {
669 Py_DECREF(args);
Brian Curtin09b86d12012-04-17 16:57:09 -0500670 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400671 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500672
Brian Curtin94c001b2012-04-18 08:30:51 -0500673 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500674 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500675 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500676
Brian Curtin94c001b2012-04-18 08:30:51 -0500677 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500678 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500679 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500680
681 Py_INCREF(msg);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400682 PyTuple_SET_ITEM(args, 0, msg);
Victor Stinner479054b2013-07-17 21:54:25 +0200683
684 if (PyDict_SetItemString(kwargs, "name", name) < 0)
685 return NULL;
686 if (PyDict_SetItemString(kwargs, "path", path) < 0)
687 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400688
Brett Cannon82da8882013-07-04 17:48:16 -0400689 error = PyObject_Call(PyExc_ImportError, args, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400690 if (error != NULL) {
691 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500692 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400693 }
694
Brett Cannon79ec55e2012-04-12 20:24:54 -0400695 Py_DECREF(args);
696 Py_DECREF(kwargs);
697
Brian Curtin09b86d12012-04-17 16:57:09 -0500698 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400699}
700
Guido van Rossum683a0721990-10-21 22:09:12 +0000701void
Neal Norwitzb382b842007-08-24 20:00:37 +0000702_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 PyErr_Format(PyExc_SystemError,
705 "%s:%d: bad argument to internal function",
706 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000707}
708
709/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
710 export the entry point for existing object code: */
711#undef PyErr_BadInternalCall
712void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000713PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000714{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200715 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 PyErr_Format(PyExc_SystemError,
717 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000718}
Fred Drake6d63adf2000-08-24 22:38:39 +0000719#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
720
Guido van Rossum1548bac1997-02-14 17:09:47 +0000721
722
Guido van Rossum1548bac1997-02-14 17:09:47 +0000723PyObject *
724PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 va_list vargs;
727 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000728
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000729#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000731#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000733#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000734
Victor Stinnerace47d72013-07-18 01:41:08 +0200735#ifdef Py_DEBUG
736 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
737 if an exception is set when it is called */
738 PyErr_Clear();
739#endif
740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 string = PyUnicode_FromFormatV(format, vargs);
742 PyErr_SetObject(exception, string);
743 Py_XDECREF(string);
744 va_end(vargs);
745 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000746}
Guido van Rossum7617e051997-09-16 18:43:50 +0000747
748
Thomas Wouters477c8d52006-05-27 19:21:47 +0000749
Guido van Rossum7617e051997-09-16 18:43:50 +0000750PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000751PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 const char *dot;
754 PyObject *modulename = NULL;
755 PyObject *classname = NULL;
756 PyObject *mydict = NULL;
757 PyObject *bases = NULL;
758 PyObject *result = NULL;
759 dot = strrchr(name, '.');
760 if (dot == NULL) {
761 PyErr_SetString(PyExc_SystemError,
762 "PyErr_NewException: name must be module.class");
763 return NULL;
764 }
765 if (base == NULL)
766 base = PyExc_Exception;
767 if (dict == NULL) {
768 dict = mydict = PyDict_New();
769 if (dict == NULL)
770 goto failure;
771 }
772 if (PyDict_GetItemString(dict, "__module__") == NULL) {
773 modulename = PyUnicode_FromStringAndSize(name,
774 (Py_ssize_t)(dot-name));
775 if (modulename == NULL)
776 goto failure;
777 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
778 goto failure;
779 }
780 if (PyTuple_Check(base)) {
781 bases = base;
782 /* INCREF as we create a new ref in the else branch */
783 Py_INCREF(bases);
784 } else {
785 bases = PyTuple_Pack(1, base);
786 if (bases == NULL)
787 goto failure;
788 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100789 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000790 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000792 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 Py_XDECREF(bases);
794 Py_XDECREF(mydict);
795 Py_XDECREF(classname);
796 Py_XDECREF(modulename);
797 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000798}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000799
Georg Brandl1e28a272009-12-28 08:41:01 +0000800
801/* Create an exception with docstring */
802PyObject *
803PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 int result;
807 PyObject *ret = NULL;
808 PyObject *mydict = NULL; /* points to the dict only if we create it */
809 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 if (dict == NULL) {
812 dict = mydict = PyDict_New();
813 if (dict == NULL) {
814 return NULL;
815 }
816 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 if (doc != NULL) {
819 docobj = PyUnicode_FromString(doc);
820 if (docobj == NULL)
821 goto failure;
822 result = PyDict_SetItemString(dict, "__doc__", docobj);
823 Py_DECREF(docobj);
824 if (result < 0)
825 goto failure;
826 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000829 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 Py_XDECREF(mydict);
831 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000832}
833
834
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000835/* Call when an exception has occurred but there is no way for Python
836 to handle it. Examples: exception in __del__ or during GC. */
837void
838PyErr_WriteUnraisable(PyObject *obj)
839{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200840 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 PyObject *f, *t, *v, *tb;
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200842 PyObject *moduleName = NULL;
843 char* className;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000844
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200845 PyErr_Fetch(&t, &v, &tb);
846
847 f = PySys_GetObject("stderr");
848 if (f == NULL || f == Py_None)
849 goto done;
850
851 if (obj) {
852 if (PyFile_WriteString("Exception ignored in: ", f) < 0)
853 goto done;
854 if (PyFile_WriteObject(obj, f, 0) < 0)
855 goto done;
856 if (PyFile_WriteString("\n", f) < 0)
857 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200859
860 if (PyTraceBack_Print(tb, f) < 0)
861 goto done;
862
863 if (!t)
864 goto done;
865
866 assert(PyExceptionClass_Check(t));
867 className = PyExceptionClass_Name(t);
868 if (className != NULL) {
869 char *dot = strrchr(className, '.');
870 if (dot != NULL)
871 className = dot+1;
872 }
873
874 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
875 if (moduleName == NULL) {
876 PyErr_Clear();
877 if (PyFile_WriteString("<unknown>", f) < 0)
878 goto done;
879 }
880 else {
881 if (PyUnicode_CompareWithASCIIString(moduleName, "builtins") != 0) {
882 if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
883 goto done;
884 if (PyFile_WriteString(".", f) < 0)
885 goto done;
886 }
887 }
888 if (className == NULL) {
889 if (PyFile_WriteString("<unknown>", f) < 0)
890 goto done;
891 }
892 else {
893 if (PyFile_WriteString(className, f) < 0)
894 goto done;
895 }
896
897 if (v && v != Py_None) {
898 if (PyFile_WriteString(": ", f) < 0)
899 goto done;
900 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
901 goto done;
902 }
903 if (PyFile_WriteString("\n", f) < 0)
904 goto done;
905
906done:
907 Py_XDECREF(moduleName);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Py_XDECREF(t);
909 Py_XDECREF(v);
910 Py_XDECREF(tb);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200911 PyErr_Clear(); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000912}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000913
Armin Rigo092381a2003-10-25 14:29:27 +0000914extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000915
Guido van Rossum2fd45652001-02-28 21:46:24 +0000916
Benjamin Peterson2c539712010-09-20 22:42:10 +0000917void
Victor Stinner14e461d2013-08-26 22:28:21 +0200918PyErr_SyntaxLocation(const char *filename, int lineno)
919{
Benjamin Peterson2c539712010-09-20 22:42:10 +0000920 PyErr_SyntaxLocationEx(filename, lineno, -1);
921}
922
923
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000924/* Set file and line information for the current exception.
925 If the exception is not a SyntaxError, also sets additional attributes
926 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000927
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000928void
Victor Stinner14e461d2013-08-26 22:28:21 +0200929PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200932 _Py_IDENTIFIER(filename);
933 _Py_IDENTIFIER(lineno);
934 _Py_IDENTIFIER(msg);
935 _Py_IDENTIFIER(offset);
936 _Py_IDENTIFIER(print_file_and_line);
937 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 /* add attributes for the line number and filename for the error */
940 PyErr_Fetch(&exc, &v, &tb);
941 PyErr_NormalizeException(&exc, &v, &tb);
942 /* XXX check that it is, indeed, a syntax error. It might not
943 * be, though. */
944 tmp = PyLong_FromLong(lineno);
945 if (tmp == NULL)
946 PyErr_Clear();
947 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200948 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 PyErr_Clear();
950 Py_DECREF(tmp);
951 }
Benjamin Peterson2c539712010-09-20 22:42:10 +0000952 if (col_offset >= 0) {
953 tmp = PyLong_FromLong(col_offset);
954 if (tmp == NULL)
955 PyErr_Clear();
956 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200957 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +0000958 PyErr_Clear();
959 Py_DECREF(tmp);
960 }
961 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 if (filename != NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +0200963 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000965
Victor Stinner14e461d2013-08-26 22:28:21 +0200966 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200968 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 PyErr_Clear();
970 Py_DECREF(tmp);
971 }
972 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200973 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyErr_Clear();
975 }
976 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200977 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 tmp = PyObject_Str(v);
979 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200980 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 PyErr_Clear();
982 Py_DECREF(tmp);
983 } else {
984 PyErr_Clear();
985 }
986 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200987 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
988 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
989 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 PyErr_Clear();
991 }
992 }
993 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000994}
995
Victor Stinner14e461d2013-08-26 22:28:21 +0200996void
997PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
998{
999 PyObject *fileobj;
1000 if (filename != NULL) {
1001 fileobj = PyUnicode_DecodeFSDefault(filename);
1002 if (fileobj == NULL)
1003 PyErr_Clear();
1004 }
1005 else
1006 fileobj = NULL;
1007 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1008 Py_XDECREF(fileobj);
1009}
1010
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001011/* Attempt to load the line of text that the exception refers to. If it
1012 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001013
1014 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001015 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001016
Antoine Pitrou409b5382013-10-12 22:41:17 +02001017static PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001018err_programtext(FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 int i;
1021 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 if (fp == NULL)
1024 return NULL;
1025 for (i = 0; i < lineno; i++) {
1026 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1027 do {
1028 *pLastChar = '\0';
1029 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1030 fp, NULL) == NULL)
1031 break;
1032 /* fgets read *something*; if it didn't get as
1033 far as pLastChar, it must have found a newline
1034 or hit the end of the file; if pLastChar is \n,
1035 it obviously found a newline; else we haven't
1036 yet seen a newline, so must continue */
1037 } while (*pLastChar != '\0' && *pLastChar != '\n');
1038 }
1039 fclose(fp);
1040 if (i == lineno) {
1041 char *p = linebuf;
1042 PyObject *res;
1043 while (*p == ' ' || *p == '\t' || *p == '\014')
1044 p++;
1045 res = PyUnicode_FromString(p);
1046 if (res == NULL)
1047 PyErr_Clear();
1048 return res;
1049 }
1050 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001051}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052
Victor Stinner14e461d2013-08-26 22:28:21 +02001053PyObject *
1054PyErr_ProgramText(const char *filename, int lineno)
1055{
1056 FILE *fp;
1057 if (filename == NULL || *filename == '\0' || lineno <= 0)
1058 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001059 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001060 return err_programtext(fp, lineno);
1061}
1062
1063PyObject *
1064PyErr_ProgramTextObject(PyObject *filename, int lineno)
1065{
1066 FILE *fp;
1067 if (filename == NULL || lineno <= 0)
1068 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001069 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001070 return err_programtext(fp, lineno);
1071}
1072
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073#ifdef __cplusplus
1074}
1075#endif