blob: 0057e5eb36ff39a9ace1243fd60ef6194662a9c9 [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{
Larry Hastingsb0827312014-02-09 22:05:19 -0800413 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
414}
415
416PyObject *
417PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200420 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100422#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000424#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000425
Guido van Rossume9fbc091995-02-18 14:52:19 +0000426#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 if (i == EINTR && PyErr_CheckSignals())
428 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000429#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000430
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000431#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100432 if (i != 0) {
433 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100434 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100435 }
436 else {
437 /* Sometimes errno didn't get set */
438 message = PyUnicode_FromString("Error");
439 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000440#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 if (i == 0)
442 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
443 else
444 {
445 /* Note that the Win32 errors do not lineup with the
446 errno error. So if the error is in the MSVC error
447 table, we use it, otherwise we assume it really _is_
448 a Win32 error code
449 */
450 if (i > 0 && i < _sys_nerr) {
451 message = PyUnicode_FromString(_sys_errlist[i]);
452 }
453 else {
454 int len = FormatMessageW(
455 FORMAT_MESSAGE_ALLOCATE_BUFFER |
456 FORMAT_MESSAGE_FROM_SYSTEM |
457 FORMAT_MESSAGE_IGNORE_INSERTS,
458 NULL, /* no message source */
459 i,
460 MAKELANGID(LANG_NEUTRAL,
461 SUBLANG_DEFAULT),
462 /* Default language */
463 (LPWSTR) &s_buf,
464 0, /* size not used */
465 NULL); /* no args */
466 if (len==0) {
467 /* Only ever seen this in out-of-mem
468 situations */
469 s_buf = NULL;
470 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
471 } else {
472 /* remove trailing cr/lf and dots */
473 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
474 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200475 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 }
477 }
478 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000479#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 if (message == NULL)
482 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000483#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 return NULL;
487 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000488
Larry Hastingsb0827312014-02-09 22:05:19 -0800489 if (filenameObject != NULL) {
490 if (filenameObject2 != NULL)
491 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
492 else
493 args = Py_BuildValue("(iOO)", i, message, filenameObject);
494 } else {
495 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200496 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800497 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000499
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200500 if (args != NULL) {
501 v = PyObject_Call(exc, args, NULL);
502 Py_DECREF(args);
503 if (v != NULL) {
504 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
505 Py_DECREF(v);
506 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000508#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000512}
Guido van Rossum743007d1999-04-21 15:27:31 +0000513
Barry Warsaw97d95151998-07-23 16:05:56 +0000514PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000515PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800518 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 Py_XDECREF(name);
520 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000521}
522
Larry Hastingsb0827312014-02-09 22:05:19 -0800523PyObject *
524PyErr_SetFromErrnoWithFilenames(PyObject *exc, const char *filename, const char *filename2)
525{
526 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
527 PyObject *name2 = filename2 ? PyUnicode_DecodeFSDefault(filename2) : NULL;
528 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, name2);
529 Py_XDECREF(name);
530 Py_XDECREF(name2);
531 return result;
532}
533
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000534#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000535PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000536PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyObject *name = filename ?
539 PyUnicode_FromUnicode(filename, wcslen(filename)) :
540 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800541 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 Py_XDECREF(name);
543 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000544}
Larry Hastingsb0827312014-02-09 22:05:19 -0800545
546PyObject *
547PyErr_SetFromErrnoWithUnicodeFilenames(PyObject *exc, const Py_UNICODE *filename, const Py_UNICODE *filename2)
548{
549 PyObject *name = filename ?
550 PyUnicode_FromUnicode(filename, wcslen(filename)) :
551 NULL;
552 PyObject *name2 = filename2 ?
553 PyUnicode_FromUnicode(filename2, wcslen(filename2)) :
554 NULL;
555 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, name2);
556 Py_XDECREF(name);
557 Py_XDECREF(name2);
558 return result;
559}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000560#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000561
562PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000563PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000564{
Larry Hastingsb0827312014-02-09 22:05:19 -0800565 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000566}
Guido van Rossum683a0721990-10-21 22:09:12 +0000567
Brett Cannonbf364092006-03-01 04:25:17 +0000568#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000569/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000570PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 PyObject *exc,
572 int ierr,
573 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000574{
Larry Hastingsb0827312014-02-09 22:05:19 -0800575 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
576 filenameObject, NULL);
577}
578
579PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
580 PyObject *exc,
581 int ierr,
582 PyObject *filenameObject,
583 PyObject *filenameObject2)
584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 int len;
586 WCHAR *s_buf = NULL; /* Free via LocalFree */
587 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200588 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 DWORD err = (DWORD)ierr;
590 if (err==0) err = GetLastError();
591 len = FormatMessageW(
592 /* Error API error */
593 FORMAT_MESSAGE_ALLOCATE_BUFFER |
594 FORMAT_MESSAGE_FROM_SYSTEM |
595 FORMAT_MESSAGE_IGNORE_INSERTS,
596 NULL, /* no message source */
597 err,
598 MAKELANGID(LANG_NEUTRAL,
599 SUBLANG_DEFAULT), /* Default language */
600 (LPWSTR) &s_buf,
601 0, /* size not used */
602 NULL); /* no args */
603 if (len==0) {
604 /* Only seen this in out of mem situations */
605 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
606 s_buf = NULL;
607 } else {
608 /* remove trailing cr/lf and dots */
609 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
610 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200611 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 if (message == NULL)
615 {
616 LocalFree(s_buf);
617 return NULL;
618 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000619
Larry Hastingsb0827312014-02-09 22:05:19 -0800620 if (filenameObject == NULL) {
621 assert(filenameObject2 == NULL);
622 filenameObject = filenameObject2 = Py_None;
623 }
624 else if (filenameObject2 == NULL)
625 filenameObject2 = Py_None;
626 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200627 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800628 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000630
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200631 if (args != NULL) {
632 v = PyObject_Call(exc, args, NULL);
633 Py_DECREF(args);
634 if (v != NULL) {
635 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
636 Py_DECREF(v);
637 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 }
639 LocalFree(s_buf);
640 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000641}
642
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000643PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 PyObject *exc,
645 int ierr,
646 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000647{
Victor Stinner92be9392010-12-28 00:28:21 +0000648 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800649 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800651 name,
652 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_XDECREF(name);
654 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000655}
656
Larry Hastingsb0827312014-02-09 22:05:19 -0800657PyObject *PyErr_SetExcFromWindowsErrWithFilenames(
658 PyObject *exc,
659 int ierr,
660 const char *filename,
661 const char *filename2)
662{
663 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
664 PyObject *name2 = filename2 ? PyUnicode_DecodeFSDefault(filename2) : NULL;
665 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
666 ierr,
667 name,
668 name2);
669 Py_XDECREF(name);
670 Py_XDECREF(name2);
671 return ret;
672}
673
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000674PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyObject *exc,
676 int ierr,
677 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 PyObject *name = filename ?
680 PyUnicode_FromUnicode(filename, wcslen(filename)) :
681 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800682 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800684 name,
685 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 Py_XDECREF(name);
687 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000688}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000689
Larry Hastingsb0827312014-02-09 22:05:19 -0800690PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilenames(
691 PyObject *exc,
692 int ierr,
693 const Py_UNICODE *filename,
694 const Py_UNICODE *filename2)
695{
696 PyObject *name = filename ?
697 PyUnicode_FromUnicode(filename, wcslen(filename)) :
698 NULL;
699 PyObject *name2 = filename2 ?
700 PyUnicode_FromUnicode(filename2, wcslen(filename2)) :
701 NULL;
702 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
703 ierr,
704 name,
705 name2);
706 Py_XDECREF(name);
707 Py_XDECREF(name2);
708 return ret;
709}
710
Thomas Heller085358a2002-07-29 14:27:41 +0000711PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
712{
Larry Hastingsb0827312014-02-09 22:05:19 -0800713 return PyErr_SetExcFromWindowsErrWithFilenames(exc, ierr, NULL, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000714}
715
Guido van Rossum795e1892000-02-17 15:19:15 +0000716PyObject *PyErr_SetFromWindowsErr(int ierr)
717{
Larry Hastingsb0827312014-02-09 22:05:19 -0800718 return PyErr_SetExcFromWindowsErrWithFilenames(PyExc_OSError,
719 ierr, NULL, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000720}
Larry Hastingsb0827312014-02-09 22:05:19 -0800721
722PyObject *PyErr_SetFromWindowsErrWithFilenames(
723 int ierr,
724 const char *filename,
725 const char *filename2)
726{
727 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
728 PyObject *name2 = filename2 ? PyUnicode_DecodeFSDefault(filename2) : NULL;
729 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
730 PyExc_OSError,
731 ierr, name, name2);
732 Py_XDECREF(name);
733 Py_XDECREF(name2);
734 return result;
735}
736
Thomas Heller085358a2002-07-29 14:27:41 +0000737PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 int ierr,
739 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000740{
Victor Stinner92be9392010-12-28 00:28:21 +0000741 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800742 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200743 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800744 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 Py_XDECREF(name);
746 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000747}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000748
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000749PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 int ierr,
751 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 PyObject *name = filename ?
754 PyUnicode_FromUnicode(filename, wcslen(filename)) :
755 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800756 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200757 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800758 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 Py_XDECREF(name);
760 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000761}
Larry Hastingsb0827312014-02-09 22:05:19 -0800762
763PyObject *PyErr_SetFromWindowsErrWithUnicodeFilenames(
764 int ierr,
765 const Py_UNICODE *filename,
766 const Py_UNICODE *filename2)
767{
768 PyObject *name = filename ?
769 PyUnicode_FromUnicode(filename, wcslen(filename)) :
770 NULL;
771 PyObject *name2 = filename2 ?
772 PyUnicode_FromUnicode(filename2, wcslen(filename2)) :
773 NULL;
774 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
775 PyExc_OSError,
776 ierr, name, name2);
777 Py_XDECREF(name);
778 Py_XDECREF(name2);
779 return result;
780}
Guido van Rossum795e1892000-02-17 15:19:15 +0000781#endif /* MS_WINDOWS */
782
Brett Cannon79ec55e2012-04-12 20:24:54 -0400783PyObject *
Brett Cannon82da8882013-07-04 17:48:16 -0400784PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400785{
Brian Curtin09b86d12012-04-17 16:57:09 -0500786 PyObject *args, *kwargs, *error;
787
Brett Cannon82da8882013-07-04 17:48:16 -0400788 if (msg == NULL)
Brian Curtin94c001b2012-04-18 08:30:51 -0500789 return NULL;
790
Antoine Pitrouec9bac42012-04-18 16:57:54 +0200791 args = PyTuple_New(1);
Brian Curtin09b86d12012-04-17 16:57:09 -0500792 if (args == NULL)
793 return NULL;
794
795 kwargs = PyDict_New();
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400796 if (kwargs == NULL) {
797 Py_DECREF(args);
Brian Curtin09b86d12012-04-17 16:57:09 -0500798 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400799 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500800
Brian Curtin94c001b2012-04-18 08:30:51 -0500801 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500802 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500803 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500804
Brian Curtin94c001b2012-04-18 08:30:51 -0500805 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500806 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500807 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500808
809 Py_INCREF(msg);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400810 PyTuple_SET_ITEM(args, 0, msg);
Victor Stinner479054b2013-07-17 21:54:25 +0200811
812 if (PyDict_SetItemString(kwargs, "name", name) < 0)
813 return NULL;
814 if (PyDict_SetItemString(kwargs, "path", path) < 0)
815 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400816
Brett Cannon82da8882013-07-04 17:48:16 -0400817 error = PyObject_Call(PyExc_ImportError, args, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400818 if (error != NULL) {
819 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500820 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400821 }
822
Brett Cannon79ec55e2012-04-12 20:24:54 -0400823 Py_DECREF(args);
824 Py_DECREF(kwargs);
825
Brian Curtin09b86d12012-04-17 16:57:09 -0500826 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400827}
828
Guido van Rossum683a0721990-10-21 22:09:12 +0000829void
Neal Norwitzb382b842007-08-24 20:00:37 +0000830_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 PyErr_Format(PyExc_SystemError,
833 "%s:%d: bad argument to internal function",
834 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000835}
836
837/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
838 export the entry point for existing object code: */
839#undef PyErr_BadInternalCall
840void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000842{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200843 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyErr_Format(PyExc_SystemError,
845 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000846}
Fred Drake6d63adf2000-08-24 22:38:39 +0000847#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
848
Guido van Rossum1548bac1997-02-14 17:09:47 +0000849
850
Guido van Rossum1548bac1997-02-14 17:09:47 +0000851PyObject *
852PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 va_list vargs;
855 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000856
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000857#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000859#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000861#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000862
Victor Stinnerace47d72013-07-18 01:41:08 +0200863#ifdef Py_DEBUG
864 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
865 if an exception is set when it is called */
866 PyErr_Clear();
867#endif
868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 string = PyUnicode_FromFormatV(format, vargs);
870 PyErr_SetObject(exception, string);
871 Py_XDECREF(string);
872 va_end(vargs);
873 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000874}
Guido van Rossum7617e051997-09-16 18:43:50 +0000875
876
Thomas Wouters477c8d52006-05-27 19:21:47 +0000877
Guido van Rossum7617e051997-09-16 18:43:50 +0000878PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000879PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 const char *dot;
882 PyObject *modulename = NULL;
883 PyObject *classname = NULL;
884 PyObject *mydict = NULL;
885 PyObject *bases = NULL;
886 PyObject *result = NULL;
887 dot = strrchr(name, '.');
888 if (dot == NULL) {
889 PyErr_SetString(PyExc_SystemError,
890 "PyErr_NewException: name must be module.class");
891 return NULL;
892 }
893 if (base == NULL)
894 base = PyExc_Exception;
895 if (dict == NULL) {
896 dict = mydict = PyDict_New();
897 if (dict == NULL)
898 goto failure;
899 }
900 if (PyDict_GetItemString(dict, "__module__") == NULL) {
901 modulename = PyUnicode_FromStringAndSize(name,
902 (Py_ssize_t)(dot-name));
903 if (modulename == NULL)
904 goto failure;
905 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
906 goto failure;
907 }
908 if (PyTuple_Check(base)) {
909 bases = base;
910 /* INCREF as we create a new ref in the else branch */
911 Py_INCREF(bases);
912 } else {
913 bases = PyTuple_Pack(1, base);
914 if (bases == NULL)
915 goto failure;
916 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100917 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000918 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000920 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 Py_XDECREF(bases);
922 Py_XDECREF(mydict);
923 Py_XDECREF(classname);
924 Py_XDECREF(modulename);
925 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000926}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000927
Georg Brandl1e28a272009-12-28 08:41:01 +0000928
929/* Create an exception with docstring */
930PyObject *
931PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 int result;
935 PyObject *ret = NULL;
936 PyObject *mydict = NULL; /* points to the dict only if we create it */
937 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 if (dict == NULL) {
940 dict = mydict = PyDict_New();
941 if (dict == NULL) {
942 return NULL;
943 }
944 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 if (doc != NULL) {
947 docobj = PyUnicode_FromString(doc);
948 if (docobj == NULL)
949 goto failure;
950 result = PyDict_SetItemString(dict, "__doc__", docobj);
951 Py_DECREF(docobj);
952 if (result < 0)
953 goto failure;
954 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000957 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 Py_XDECREF(mydict);
959 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000960}
961
962
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000963/* Call when an exception has occurred but there is no way for Python
964 to handle it. Examples: exception in __del__ or during GC. */
965void
966PyErr_WriteUnraisable(PyObject *obj)
967{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200968 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 PyObject *f, *t, *v, *tb;
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200970 PyObject *moduleName = NULL;
971 char* className;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000972
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200973 PyErr_Fetch(&t, &v, &tb);
974
Victor Stinnerbd303c12013-11-07 23:07:29 +0100975 f = _PySys_GetObjectId(&PyId_stderr);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200976 if (f == NULL || f == Py_None)
977 goto done;
978
979 if (obj) {
980 if (PyFile_WriteString("Exception ignored in: ", f) < 0)
981 goto done;
982 if (PyFile_WriteObject(obj, f, 0) < 0)
983 goto done;
984 if (PyFile_WriteString("\n", f) < 0)
985 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200987
988 if (PyTraceBack_Print(tb, f) < 0)
989 goto done;
990
991 if (!t)
992 goto done;
993
994 assert(PyExceptionClass_Check(t));
995 className = PyExceptionClass_Name(t);
996 if (className != NULL) {
997 char *dot = strrchr(className, '.');
998 if (dot != NULL)
999 className = dot+1;
1000 }
1001
1002 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
1003 if (moduleName == NULL) {
1004 PyErr_Clear();
1005 if (PyFile_WriteString("<unknown>", f) < 0)
1006 goto done;
1007 }
1008 else {
Victor Stinnerbd303c12013-11-07 23:07:29 +01001009 if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001010 if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
1011 goto done;
1012 if (PyFile_WriteString(".", f) < 0)
1013 goto done;
1014 }
1015 }
1016 if (className == NULL) {
1017 if (PyFile_WriteString("<unknown>", f) < 0)
1018 goto done;
1019 }
1020 else {
1021 if (PyFile_WriteString(className, f) < 0)
1022 goto done;
1023 }
1024
1025 if (v && v != Py_None) {
1026 if (PyFile_WriteString(": ", f) < 0)
1027 goto done;
1028 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
1029 goto done;
1030 }
1031 if (PyFile_WriteString("\n", f) < 0)
1032 goto done;
1033
1034done:
1035 Py_XDECREF(moduleName);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 Py_XDECREF(t);
1037 Py_XDECREF(v);
1038 Py_XDECREF(tb);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001039 PyErr_Clear(); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001040}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001041
Armin Rigo092381a2003-10-25 14:29:27 +00001042extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001043
Guido van Rossum2fd45652001-02-28 21:46:24 +00001044
Benjamin Peterson2c539712010-09-20 22:42:10 +00001045void
Victor Stinner14e461d2013-08-26 22:28:21 +02001046PyErr_SyntaxLocation(const char *filename, int lineno)
1047{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001048 PyErr_SyntaxLocationEx(filename, lineno, -1);
1049}
1050
1051
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001052/* Set file and line information for the current exception.
1053 If the exception is not a SyntaxError, also sets additional attributes
1054 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001055
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001056void
Victor Stinner14e461d2013-08-26 22:28:21 +02001057PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001060 _Py_IDENTIFIER(filename);
1061 _Py_IDENTIFIER(lineno);
1062 _Py_IDENTIFIER(msg);
1063 _Py_IDENTIFIER(offset);
1064 _Py_IDENTIFIER(print_file_and_line);
1065 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 /* add attributes for the line number and filename for the error */
1068 PyErr_Fetch(&exc, &v, &tb);
1069 PyErr_NormalizeException(&exc, &v, &tb);
1070 /* XXX check that it is, indeed, a syntax error. It might not
1071 * be, though. */
1072 tmp = PyLong_FromLong(lineno);
1073 if (tmp == NULL)
1074 PyErr_Clear();
1075 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001076 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 PyErr_Clear();
1078 Py_DECREF(tmp);
1079 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001080 if (col_offset >= 0) {
1081 tmp = PyLong_FromLong(col_offset);
1082 if (tmp == NULL)
1083 PyErr_Clear();
1084 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001085 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +00001086 PyErr_Clear();
1087 Py_DECREF(tmp);
1088 }
1089 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 if (filename != NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001091 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001093
Victor Stinner14e461d2013-08-26 22:28:21 +02001094 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001096 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 PyErr_Clear();
1098 Py_DECREF(tmp);
1099 }
1100 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001101 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 PyErr_Clear();
1103 }
1104 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001105 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 tmp = PyObject_Str(v);
1107 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001108 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 PyErr_Clear();
1110 Py_DECREF(tmp);
1111 } else {
1112 PyErr_Clear();
1113 }
1114 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001115 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1116 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
1117 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 PyErr_Clear();
1119 }
1120 }
1121 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001122}
1123
Victor Stinner14e461d2013-08-26 22:28:21 +02001124void
1125PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1126{
1127 PyObject *fileobj;
1128 if (filename != NULL) {
1129 fileobj = PyUnicode_DecodeFSDefault(filename);
1130 if (fileobj == NULL)
1131 PyErr_Clear();
1132 }
1133 else
1134 fileobj = NULL;
1135 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1136 Py_XDECREF(fileobj);
1137}
1138
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001139/* Attempt to load the line of text that the exception refers to. If it
1140 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001141
1142 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001143 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001144
Antoine Pitrou409b5382013-10-12 22:41:17 +02001145static PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001146err_programtext(FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 int i;
1149 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 if (fp == NULL)
1152 return NULL;
1153 for (i = 0; i < lineno; i++) {
1154 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1155 do {
1156 *pLastChar = '\0';
1157 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1158 fp, NULL) == NULL)
1159 break;
1160 /* fgets read *something*; if it didn't get as
1161 far as pLastChar, it must have found a newline
1162 or hit the end of the file; if pLastChar is \n,
1163 it obviously found a newline; else we haven't
1164 yet seen a newline, so must continue */
1165 } while (*pLastChar != '\0' && *pLastChar != '\n');
1166 }
1167 fclose(fp);
1168 if (i == lineno) {
1169 char *p = linebuf;
1170 PyObject *res;
1171 while (*p == ' ' || *p == '\t' || *p == '\014')
1172 p++;
1173 res = PyUnicode_FromString(p);
1174 if (res == NULL)
1175 PyErr_Clear();
1176 return res;
1177 }
1178 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001179}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180
Victor Stinner14e461d2013-08-26 22:28:21 +02001181PyObject *
1182PyErr_ProgramText(const char *filename, int lineno)
1183{
1184 FILE *fp;
1185 if (filename == NULL || *filename == '\0' || lineno <= 0)
1186 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001187 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001188 return err_programtext(fp, lineno);
1189}
1190
1191PyObject *
1192PyErr_ProgramTextObject(PyObject *filename, int lineno)
1193{
1194 FILE *fp;
1195 if (filename == NULL || lineno <= 0)
1196 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001197 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001198 return err_programtext(fp, lineno);
1199}
1200
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001201#ifdef __cplusplus
1202}
1203#endif