blob: db0baf1c24751080f3c6d50964e12cad8256edc9 [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 Pitrou7f14f0d2010-05-09 16:14:21 +000027 PyThreadState *tstate = PyThreadState_GET();
28 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +000055 PyThreadState *tstate = PyThreadState_GET();
56 PyObject *exc_value;
57 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000058
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000059 if (exception != NULL &&
60 !PyExceptionClass_Check(exception)) {
61 PyErr_Format(PyExc_SystemError,
62 "exception %R not a BaseException subclass",
63 exception);
64 return;
65 }
66 Py_XINCREF(value);
67 exc_value = tstate->exc_value;
68 if (exc_value != NULL && exc_value != Py_None) {
69 /* Implicit exception chaining */
70 Py_INCREF(exc_value);
71 if (value == NULL || !PyExceptionInstance_Check(value)) {
72 /* We must normalize the value right now */
73 PyObject *args, *fixed_value;
74 if (value == NULL || value == Py_None)
75 args = PyTuple_New(0);
76 else if (PyTuple_Check(value)) {
77 Py_INCREF(value);
78 args = value;
79 }
80 else
81 args = PyTuple_Pack(1, value);
82 fixed_value = args ?
83 PyEval_CallObject(exception, args) : NULL;
84 Py_XDECREF(args);
85 Py_XDECREF(value);
86 if (fixed_value == NULL)
87 return;
88 value = fixed_value;
89 }
90 /* Avoid reference cycles through the context chain.
91 This is O(chain length) but context chains are
92 usually very short. Sensitive readers may try
93 to inline the call to PyException_GetContext. */
94 if (exc_value != value) {
95 PyObject *o = exc_value, *context;
96 while ((context = PyException_GetContext(o))) {
97 Py_DECREF(context);
98 if (context == value) {
99 PyException_SetContext(o, NULL);
100 break;
101 }
102 o = context;
103 }
104 PyException_SetContext(value, exc_value);
105 } else {
106 Py_DECREF(exc_value);
107 }
108 }
109 if (value != NULL && PyExceptionInstance_Check(value))
110 tb = PyException_GetTraceback(value);
111 Py_XINCREF(exception);
112 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113}
114
115void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000118 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119}
120
121void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000124 PyObject *value = PyUnicode_FromString(string);
125 PyErr_SetObject(exception, value);
126 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
Guido van Rossum3a241811994-08-29 12:14:12 +0000129
Guido van Rossum373c8691997-04-29 18:22:47 +0000130PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000133 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000135 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000138
139int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000140PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000141{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000142 if (err == NULL || exc == NULL) {
143 /* maybe caused by "import exceptions" that failed early on */
144 return 0;
145 }
146 if (PyTuple_Check(exc)) {
147 Py_ssize_t i, n;
148 n = PyTuple_Size(exc);
149 for (i = 0; i < n; i++) {
150 /* Test recursively */
151 if (PyErr_GivenExceptionMatches(
152 err, PyTuple_GET_ITEM(exc, i)))
153 {
154 return 1;
155 }
156 }
157 return 0;
158 }
159 /* err might be an instance, so check its class. */
160 if (PyExceptionInstance_Check(err))
161 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000162
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000163 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
164 int res = 0;
165 PyObject *exception, *value, *tb;
166 PyErr_Fetch(&exception, &value, &tb);
167 /* PyObject_IsSubclass() can recurse and therefore is
168 not safe (see test_bad_getattr in test.pickletester). */
169 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
170 /* This function must not fail, so print the error here */
171 if (res == -1) {
172 PyErr_WriteUnraisable(err);
173 res = 0;
174 }
175 PyErr_Restore(exception, value, tb);
176 return res;
177 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000178
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000179 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000180}
Guido van Rossum743007d1999-04-21 15:27:31 +0000181
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000182
183int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000184PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000185{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000186 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000187}
188
189
190/* Used in many places to normalize a raised exception, including in
191 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000192
193 XXX: should PyErr_NormalizeException() also call
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000194 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000195*/
196void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000197PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000198{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000199 PyObject *type = *exc;
200 PyObject *value = *val;
201 PyObject *inclass = NULL;
202 PyObject *initial_tb = NULL;
203 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000204
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000205 if (type == NULL) {
206 /* There was no exception, so nothing to do. */
207 return;
208 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000209
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000210 /* If PyErr_SetNone() was used, the value will have been actually
211 set to NULL.
212 */
213 if (!value) {
214 value = Py_None;
215 Py_INCREF(value);
216 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000217
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000218 if (PyExceptionInstance_Check(value))
219 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000220
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000221 /* Normalize the exception so that if the type is a class, the
222 value will be an instance.
223 */
224 if (PyExceptionClass_Check(type)) {
225 /* if the value was not an instance, or is not an instance
226 whose class is (or is derived from) type, then use the
227 value as an argument to instantiation of the type
228 class.
229 */
230 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
231 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000232
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000233 if (value == Py_None)
234 args = PyTuple_New(0);
235 else if (PyTuple_Check(value)) {
236 Py_INCREF(value);
237 args = value;
238 }
239 else
240 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000241
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000242 if (args == NULL)
243 goto finally;
244 res = PyEval_CallObject(type, args);
245 Py_DECREF(args);
246 if (res == NULL)
247 goto finally;
248 Py_DECREF(value);
249 value = res;
250 }
251 /* if the class of the instance doesn't exactly match the
252 class of the type, believe the instance
253 */
254 else if (inclass != type) {
255 Py_DECREF(type);
256 type = inclass;
257 Py_INCREF(type);
258 }
259 }
260 *exc = type;
261 *val = value;
262 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000263finally:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000264 Py_DECREF(type);
265 Py_DECREF(value);
266 /* If the new exception doesn't set a traceback and the old
267 exception had a traceback, use the old traceback for the
268 new exception. It's better than nothing.
269 */
270 initial_tb = *tb;
271 PyErr_Fetch(exc, val, tb);
272 if (initial_tb != NULL) {
273 if (*tb == NULL)
274 *tb = initial_tb;
275 else
276 Py_DECREF(initial_tb);
277 }
278 /* normalize recursively */
279 tstate = PyThreadState_GET();
280 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
281 --tstate->recursion_depth;
282 /* throw away the old exception... */
283 Py_DECREF(*exc);
284 Py_DECREF(*val);
285 /* ... and use the recursion error instead */
286 *exc = PyExc_RuntimeError;
287 *val = PyExc_RecursionErrorInst;
288 Py_INCREF(*exc);
289 Py_INCREF(*val);
290 /* just keeping the old traceback */
291 return;
292 }
293 PyErr_NormalizeException(exc, val, tb);
294 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000295}
296
297
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000299PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000301 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000302
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000303 *p_type = tstate->curexc_type;
304 *p_value = tstate->curexc_value;
305 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000306
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000307 tstate->curexc_type = NULL;
308 tstate->curexc_value = NULL;
309 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310}
311
312void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000313PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000315 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000317
318/* Convenience functions to set a type error exception and return 0 */
319
320int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000322{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000323 PyErr_SetString(PyExc_TypeError,
324 "bad argument type for built-in operation");
325 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000326}
327
Guido van Rossum373c8691997-04-29 18:22:47 +0000328PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000329PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000330{
Antoine Pitrou98e2b452010-10-28 23:06:57 +0000331 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000332 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000333}
334
Guido van Rossum373c8691997-04-29 18:22:47 +0000335PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000336PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000337{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000338 PyObject *message;
339 PyObject *v;
340 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000341#ifdef PLAN9
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000342 char errbuf[ERRMAX];
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000343#else
344#ifndef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000345 char *s;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000346#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000347 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000348#endif /* Unix/Windows */
349#endif /* PLAN 9*/
350
Guido van Rossume9fbc091995-02-18 14:52:19 +0000351#ifdef EINTR
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000352 if (i == EINTR && PyErr_CheckSignals())
353 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000354#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000355
Martin v. Löwis3484a182002-03-09 12:07:51 +0000356#ifdef PLAN9
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000357 rerrstr(errbuf, sizeof errbuf);
358 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
Martin v. Löwis3484a182002-03-09 12:07:51 +0000359#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000360#ifndef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000361 if (i == 0)
362 s = "Error"; /* Sometimes errno didn't get set */
363 else
364 s = strerror(i);
365 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000366#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000367 if (i == 0)
368 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
369 else
370 {
371 /* Note that the Win32 errors do not lineup with the
372 errno error. So if the error is in the MSVC error
373 table, we use it, otherwise we assume it really _is_
374 a Win32 error code
375 */
376 if (i > 0 && i < _sys_nerr) {
377 message = PyUnicode_FromString(_sys_errlist[i]);
378 }
379 else {
380 int len = FormatMessageW(
381 FORMAT_MESSAGE_ALLOCATE_BUFFER |
382 FORMAT_MESSAGE_FROM_SYSTEM |
383 FORMAT_MESSAGE_IGNORE_INSERTS,
384 NULL, /* no message source */
385 i,
386 MAKELANGID(LANG_NEUTRAL,
387 SUBLANG_DEFAULT),
388 /* Default language */
389 (LPWSTR) &s_buf,
390 0, /* size not used */
391 NULL); /* no args */
392 if (len==0) {
393 /* Only ever seen this in out-of-mem
394 situations */
395 s_buf = NULL;
396 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
397 } else {
398 /* remove trailing cr/lf and dots */
399 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
400 s_buf[--len] = L'\0';
401 message = PyUnicode_FromUnicode(s_buf, len);
402 }
403 }
404 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000405#endif /* Unix/Windows */
406#endif /* PLAN 9*/
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000407
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000408 if (message == NULL)
409 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000410#ifdef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000411 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000412#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000413 return NULL;
414 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000415
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000416 if (filenameObject != NULL)
417 v = Py_BuildValue("(iOO)", i, message, filenameObject);
418 else
419 v = Py_BuildValue("(iO)", i, message);
420 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000421
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000422 if (v != NULL) {
423 PyErr_SetObject(exc, v);
424 Py_DECREF(v);
425 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000426#ifdef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000427 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000428#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000429 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000430}
Guido van Rossum743007d1999-04-21 15:27:31 +0000431
Barry Warsaw97d95151998-07-23 16:05:56 +0000432
433PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000434PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000435{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000436 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
437 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
438 Py_XDECREF(name);
439 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000440}
441
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000442#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000443PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000444PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000445{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000446 PyObject *name = filename ?
447 PyUnicode_FromUnicode(filename, wcslen(filename)) :
448 NULL;
449 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
450 Py_XDECREF(name);
451 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000452}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000453#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000454
455PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000457{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000458 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000459}
Guido van Rossum683a0721990-10-21 22:09:12 +0000460
Brett Cannonbf364092006-03-01 04:25:17 +0000461#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000462/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000463PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000464 PyObject *exc,
465 int ierr,
466 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000467{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000468 int len;
469 WCHAR *s_buf = NULL; /* Free via LocalFree */
470 PyObject *message;
471 PyObject *v;
472 DWORD err = (DWORD)ierr;
473 if (err==0) err = GetLastError();
474 len = FormatMessageW(
475 /* Error API error */
476 FORMAT_MESSAGE_ALLOCATE_BUFFER |
477 FORMAT_MESSAGE_FROM_SYSTEM |
478 FORMAT_MESSAGE_IGNORE_INSERTS,
479 NULL, /* no message source */
480 err,
481 MAKELANGID(LANG_NEUTRAL,
482 SUBLANG_DEFAULT), /* Default language */
483 (LPWSTR) &s_buf,
484 0, /* size not used */
485 NULL); /* no args */
486 if (len==0) {
487 /* Only seen this in out of mem situations */
488 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
489 s_buf = NULL;
490 } else {
491 /* remove trailing cr/lf and dots */
492 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
493 s_buf[--len] = L'\0';
494 message = PyUnicode_FromUnicode(s_buf, len);
495 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000496
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000497 if (message == NULL)
498 {
499 LocalFree(s_buf);
500 return NULL;
501 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000502
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000503 if (filenameObject != NULL)
504 v = Py_BuildValue("(iOO)", err, message, filenameObject);
505 else
506 v = Py_BuildValue("(iO)", err, message);
507 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000508
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000509 if (v != NULL) {
510 PyErr_SetObject(exc, v);
511 Py_DECREF(v);
512 }
513 LocalFree(s_buf);
514 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000515}
516
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000517PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000518 PyObject *exc,
519 int ierr,
520 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000521{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000522 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
523 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
524 ierr,
525 name);
526 Py_XDECREF(name);
527 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000528}
529
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000530PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000531 PyObject *exc,
532 int ierr,
533 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000534{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000535 PyObject *name = filename ?
536 PyUnicode_FromUnicode(filename, wcslen(filename)) :
537 NULL;
538 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
539 ierr,
540 name);
541 Py_XDECREF(name);
542 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000543}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000544
Thomas Heller085358a2002-07-29 14:27:41 +0000545PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
546{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000547 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000548}
549
Guido van Rossum795e1892000-02-17 15:19:15 +0000550PyObject *PyErr_SetFromWindowsErr(int ierr)
551{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000552 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
553 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000554}
555PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000556 int ierr,
557 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000558{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000559 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
560 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
561 PyExc_WindowsError,
562 ierr, name);
563 Py_XDECREF(name);
564 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000565}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000566
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000567PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000568 int ierr,
569 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000570{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000571 PyObject *name = filename ?
572 PyUnicode_FromUnicode(filename, wcslen(filename)) :
573 NULL;
574 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
575 PyExc_WindowsError,
576 ierr, name);
577 Py_XDECREF(name);
578 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000579}
Guido van Rossum795e1892000-02-17 15:19:15 +0000580#endif /* MS_WINDOWS */
581
Guido van Rossum683a0721990-10-21 22:09:12 +0000582void
Neal Norwitzb382b842007-08-24 20:00:37 +0000583_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000584{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000585 PyErr_Format(PyExc_SystemError,
586 "%s:%d: bad argument to internal function",
587 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000588}
589
590/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
591 export the entry point for existing object code: */
592#undef PyErr_BadInternalCall
593void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000594PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000595{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000596 PyErr_Format(PyExc_SystemError,
597 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000598}
Fred Drake6d63adf2000-08-24 22:38:39 +0000599#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
600
Guido van Rossum1548bac1997-02-14 17:09:47 +0000601
602
Guido van Rossum1548bac1997-02-14 17:09:47 +0000603PyObject *
604PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000605{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000606 va_list vargs;
607 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000608
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000609#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000610 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000611#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000612 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000613#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000614
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000615 string = PyUnicode_FromFormatV(format, vargs);
616 PyErr_SetObject(exception, string);
617 Py_XDECREF(string);
618 va_end(vargs);
619 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000620}
Guido van Rossum7617e051997-09-16 18:43:50 +0000621
622
Thomas Wouters477c8d52006-05-27 19:21:47 +0000623
Guido van Rossum7617e051997-09-16 18:43:50 +0000624PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000625PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000626{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000627 const char *dot;
628 PyObject *modulename = NULL;
629 PyObject *classname = NULL;
630 PyObject *mydict = NULL;
631 PyObject *bases = NULL;
632 PyObject *result = NULL;
633 dot = strrchr(name, '.');
634 if (dot == NULL) {
635 PyErr_SetString(PyExc_SystemError,
636 "PyErr_NewException: name must be module.class");
637 return NULL;
638 }
639 if (base == NULL)
640 base = PyExc_Exception;
641 if (dict == NULL) {
642 dict = mydict = PyDict_New();
643 if (dict == NULL)
644 goto failure;
645 }
646 if (PyDict_GetItemString(dict, "__module__") == NULL) {
647 modulename = PyUnicode_FromStringAndSize(name,
648 (Py_ssize_t)(dot-name));
649 if (modulename == NULL)
650 goto failure;
651 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
652 goto failure;
653 }
654 if (PyTuple_Check(base)) {
655 bases = base;
656 /* INCREF as we create a new ref in the else branch */
657 Py_INCREF(bases);
658 } else {
659 bases = PyTuple_Pack(1, base);
660 if (bases == NULL)
661 goto failure;
662 }
663 /* Create a real new-style class. */
664 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
665 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000666 failure:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000667 Py_XDECREF(bases);
668 Py_XDECREF(mydict);
669 Py_XDECREF(classname);
670 Py_XDECREF(modulename);
671 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000672}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000673
674/* Call when an exception has occurred but there is no way for Python
675 to handle it. Examples: exception in __del__ or during GC. */
676void
677PyErr_WriteUnraisable(PyObject *obj)
678{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000679 PyObject *f, *t, *v, *tb;
680 PyErr_Fetch(&t, &v, &tb);
681 f = PySys_GetObject("stderr");
682 if (f != NULL && f != Py_None) {
683 PyFile_WriteString("Exception ", f);
684 if (t) {
685 PyObject* moduleName;
686 char* className;
687 assert(PyExceptionClass_Check(t));
688 className = PyExceptionClass_Name(t);
689 if (className != NULL) {
690 char *dot = strrchr(className, '.');
691 if (dot != NULL)
692 className = dot+1;
693 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000694
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000695 moduleName = PyObject_GetAttrString(t, "__module__");
696 if (moduleName == NULL)
697 PyFile_WriteString("<unknown>", f);
698 else {
699 char* modstr = _PyUnicode_AsString(moduleName);
700 if (modstr &&
701 strcmp(modstr, "builtins") != 0)
702 {
703 PyFile_WriteString(modstr, f);
704 PyFile_WriteString(".", f);
705 }
706 }
707 if (className == NULL)
708 PyFile_WriteString("<unknown>", f);
709 else
710 PyFile_WriteString(className, f);
711 if (v && v != Py_None) {
712 PyFile_WriteString(": ", f);
713 PyFile_WriteObject(v, f, 0);
714 }
715 Py_XDECREF(moduleName);
716 }
717 PyFile_WriteString(" in ", f);
718 PyFile_WriteObject(obj, f, 0);
719 PyFile_WriteString(" ignored\n", f);
720 PyErr_Clear(); /* Just in case */
721 }
722 Py_XDECREF(t);
723 Py_XDECREF(v);
724 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000725}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000726
Armin Rigo092381a2003-10-25 14:29:27 +0000727extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000728
Guido van Rossum2fd45652001-02-28 21:46:24 +0000729
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000730/* Set file and line information for the current exception.
731 If the exception is not a SyntaxError, also sets additional attributes
732 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000733
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000734void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000735PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000736{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000737 PyObject *exc, *v, *tb, *tmp;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000738
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000739 /* add attributes for the line number and filename for the error */
740 PyErr_Fetch(&exc, &v, &tb);
741 PyErr_NormalizeException(&exc, &v, &tb);
742 /* XXX check that it is, indeed, a syntax error. It might not
743 * be, though. */
744 tmp = PyLong_FromLong(lineno);
745 if (tmp == NULL)
746 PyErr_Clear();
747 else {
748 if (PyObject_SetAttrString(v, "lineno", tmp))
749 PyErr_Clear();
750 Py_DECREF(tmp);
751 }
752 if (filename != NULL) {
753 tmp = PyUnicode_FromString(filename);
754 if (tmp == NULL)
755 PyErr_Clear();
756 else {
757 if (PyObject_SetAttrString(v, "filename", tmp))
758 PyErr_Clear();
759 Py_DECREF(tmp);
760 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000761
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000762 tmp = PyErr_ProgramText(filename, lineno);
763 if (tmp) {
764 if (PyObject_SetAttrString(v, "text", tmp))
765 PyErr_Clear();
766 Py_DECREF(tmp);
767 }
768 }
769 if (PyObject_SetAttrString(v, "offset", Py_None)) {
770 PyErr_Clear();
771 }
772 if (exc != PyExc_SyntaxError) {
773 if (!PyObject_HasAttrString(v, "msg")) {
774 tmp = PyObject_Str(v);
775 if (tmp) {
776 if (PyObject_SetAttrString(v, "msg", tmp))
777 PyErr_Clear();
778 Py_DECREF(tmp);
779 } else {
780 PyErr_Clear();
781 }
782 }
783 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
784 if (PyObject_SetAttrString(v, "print_file_and_line",
785 Py_None))
786 PyErr_Clear();
787 }
788 }
789 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000790}
791
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000792/* Attempt to load the line of text that the exception refers to. If it
793 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000794
795 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000796 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000797
798PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000799PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000800{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000801 FILE *fp;
802 int i;
803 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000804
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000805 if (filename == NULL || *filename == '\0' || lineno <= 0)
806 return NULL;
807 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
808 if (fp == NULL)
809 return NULL;
810 for (i = 0; i < lineno; i++) {
811 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
812 do {
813 *pLastChar = '\0';
814 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
815 fp, NULL) == NULL)
816 break;
817 /* fgets read *something*; if it didn't get as
818 far as pLastChar, it must have found a newline
819 or hit the end of the file; if pLastChar is \n,
820 it obviously found a newline; else we haven't
821 yet seen a newline, so must continue */
822 } while (*pLastChar != '\0' && *pLastChar != '\n');
823 }
824 fclose(fp);
825 if (i == lineno) {
826 char *p = linebuf;
827 PyObject *res;
828 while (*p == ' ' || *p == '\t' || *p == '\014')
829 p++;
830 res = PyUnicode_FromString(p);
831 if (res == NULL)
832 PyErr_Clear();
833 return res;
834 }
835 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000836}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000837
838#ifdef __cplusplus
839}
840#endif