blob: 45842052608df858d6886ce01633cf80a2297863 [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 Pitrou7f14f0d2010-05-09 16:14:21 +0000331 if (PyErr_ExceptionMatches(PyExc_MemoryError))
332 /* already current */
333 return NULL;
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000334
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000335 /* raise the pre-allocated instance if it still exists */
336 if (PyExc_MemoryErrorInst)
337 {
338 /* Clear the previous traceback, otherwise it will be appended
339 * to the current one.
340 *
341 * The following statement is not likely to raise any error;
342 * if it does, we simply discard it.
343 */
344 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000345
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000346 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
347 }
348 else
349 /* this will probably fail since there's no memory and hee,
350 hee, we have to instantiate this class
351 */
352 PyErr_SetNone(PyExc_MemoryError);
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000353
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000354 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000355}
356
Guido van Rossum373c8691997-04-29 18:22:47 +0000357PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000358PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000359{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000360 PyObject *message;
361 PyObject *v;
362 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000363#ifdef PLAN9
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000364 char errbuf[ERRMAX];
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000365#else
366#ifndef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000367 char *s;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000368#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000369 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000370#endif /* Unix/Windows */
371#endif /* PLAN 9*/
372
Guido van Rossume9fbc091995-02-18 14:52:19 +0000373#ifdef EINTR
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000374 if (i == EINTR && PyErr_CheckSignals())
375 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000376#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000377
Martin v. Löwis3484a182002-03-09 12:07:51 +0000378#ifdef PLAN9
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000379 rerrstr(errbuf, sizeof errbuf);
380 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
Martin v. Löwis3484a182002-03-09 12:07:51 +0000381#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000382#ifndef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000383 if (i == 0)
384 s = "Error"; /* Sometimes errno didn't get set */
385 else
386 s = strerror(i);
387 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000388#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000389 if (i == 0)
390 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
391 else
392 {
393 /* Note that the Win32 errors do not lineup with the
394 errno error. So if the error is in the MSVC error
395 table, we use it, otherwise we assume it really _is_
396 a Win32 error code
397 */
398 if (i > 0 && i < _sys_nerr) {
399 message = PyUnicode_FromString(_sys_errlist[i]);
400 }
401 else {
402 int len = FormatMessageW(
403 FORMAT_MESSAGE_ALLOCATE_BUFFER |
404 FORMAT_MESSAGE_FROM_SYSTEM |
405 FORMAT_MESSAGE_IGNORE_INSERTS,
406 NULL, /* no message source */
407 i,
408 MAKELANGID(LANG_NEUTRAL,
409 SUBLANG_DEFAULT),
410 /* Default language */
411 (LPWSTR) &s_buf,
412 0, /* size not used */
413 NULL); /* no args */
414 if (len==0) {
415 /* Only ever seen this in out-of-mem
416 situations */
417 s_buf = NULL;
418 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
419 } else {
420 /* remove trailing cr/lf and dots */
421 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
422 s_buf[--len] = L'\0';
423 message = PyUnicode_FromUnicode(s_buf, len);
424 }
425 }
426 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000427#endif /* Unix/Windows */
428#endif /* PLAN 9*/
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000429
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000430 if (message == NULL)
431 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000432#ifdef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000433 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000434#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000435 return NULL;
436 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000437
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000438 if (filenameObject != NULL)
439 v = Py_BuildValue("(iOO)", i, message, filenameObject);
440 else
441 v = Py_BuildValue("(iO)", i, message);
442 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000443
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000444 if (v != NULL) {
445 PyErr_SetObject(exc, v);
446 Py_DECREF(v);
447 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000448#ifdef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000449 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000450#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000451 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000452}
Guido van Rossum743007d1999-04-21 15:27:31 +0000453
Barry Warsaw97d95151998-07-23 16:05:56 +0000454
455PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000456PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000457{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000458 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
459 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
460 Py_XDECREF(name);
461 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000462}
463
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000464#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000465PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000466PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000467{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000468 PyObject *name = filename ?
469 PyUnicode_FromUnicode(filename, wcslen(filename)) :
470 NULL;
471 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
472 Py_XDECREF(name);
473 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000474}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000475#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000476
477PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000478PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000479{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000480 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000481}
Guido van Rossum683a0721990-10-21 22:09:12 +0000482
Brett Cannonbf364092006-03-01 04:25:17 +0000483#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000484/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000485PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000486 PyObject *exc,
487 int ierr,
488 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000489{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000490 int len;
491 WCHAR *s_buf = NULL; /* Free via LocalFree */
492 PyObject *message;
493 PyObject *v;
494 DWORD err = (DWORD)ierr;
495 if (err==0) err = GetLastError();
496 len = FormatMessageW(
497 /* Error API error */
498 FORMAT_MESSAGE_ALLOCATE_BUFFER |
499 FORMAT_MESSAGE_FROM_SYSTEM |
500 FORMAT_MESSAGE_IGNORE_INSERTS,
501 NULL, /* no message source */
502 err,
503 MAKELANGID(LANG_NEUTRAL,
504 SUBLANG_DEFAULT), /* Default language */
505 (LPWSTR) &s_buf,
506 0, /* size not used */
507 NULL); /* no args */
508 if (len==0) {
509 /* Only seen this in out of mem situations */
510 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
511 s_buf = NULL;
512 } else {
513 /* remove trailing cr/lf and dots */
514 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
515 s_buf[--len] = L'\0';
516 message = PyUnicode_FromUnicode(s_buf, len);
517 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000518
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000519 if (message == NULL)
520 {
521 LocalFree(s_buf);
522 return NULL;
523 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000524
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000525 if (filenameObject != NULL)
526 v = Py_BuildValue("(iOO)", err, message, filenameObject);
527 else
528 v = Py_BuildValue("(iO)", err, message);
529 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000530
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000531 if (v != NULL) {
532 PyErr_SetObject(exc, v);
533 Py_DECREF(v);
534 }
535 LocalFree(s_buf);
536 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000537}
538
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000539PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000540 PyObject *exc,
541 int ierr,
542 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000543{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000544 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
545 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
546 ierr,
547 name);
548 Py_XDECREF(name);
549 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000550}
551
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000552PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000553 PyObject *exc,
554 int ierr,
555 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000556{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000557 PyObject *name = filename ?
558 PyUnicode_FromUnicode(filename, wcslen(filename)) :
559 NULL;
560 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
561 ierr,
562 name);
563 Py_XDECREF(name);
564 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000565}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000566
Thomas Heller085358a2002-07-29 14:27:41 +0000567PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
568{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000569 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000570}
571
Guido van Rossum795e1892000-02-17 15:19:15 +0000572PyObject *PyErr_SetFromWindowsErr(int ierr)
573{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000574 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
575 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000576}
577PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000578 int ierr,
579 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000580{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000581 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
582 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
583 PyExc_WindowsError,
584 ierr, name);
585 Py_XDECREF(name);
586 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000587}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000588
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000589PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000590 int ierr,
591 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000592{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000593 PyObject *name = filename ?
594 PyUnicode_FromUnicode(filename, wcslen(filename)) :
595 NULL;
596 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
597 PyExc_WindowsError,
598 ierr, name);
599 Py_XDECREF(name);
600 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000601}
Guido van Rossum795e1892000-02-17 15:19:15 +0000602#endif /* MS_WINDOWS */
603
Guido van Rossum683a0721990-10-21 22:09:12 +0000604void
Neal Norwitzb382b842007-08-24 20:00:37 +0000605_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000606{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000607 PyErr_Format(PyExc_SystemError,
608 "%s:%d: bad argument to internal function",
609 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000610}
611
612/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
613 export the entry point for existing object code: */
614#undef PyErr_BadInternalCall
615void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000616PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000617{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000618 PyErr_Format(PyExc_SystemError,
619 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000620}
Fred Drake6d63adf2000-08-24 22:38:39 +0000621#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
622
Guido van Rossum1548bac1997-02-14 17:09:47 +0000623
624
Guido van Rossum1548bac1997-02-14 17:09:47 +0000625PyObject *
626PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000627{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000628 va_list vargs;
629 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000630
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000631#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000632 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000633#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000634 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000635#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000636
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000637 string = PyUnicode_FromFormatV(format, vargs);
638 PyErr_SetObject(exception, string);
639 Py_XDECREF(string);
640 va_end(vargs);
641 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000642}
Guido van Rossum7617e051997-09-16 18:43:50 +0000643
644
Thomas Wouters477c8d52006-05-27 19:21:47 +0000645
Guido van Rossum7617e051997-09-16 18:43:50 +0000646PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000647PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000648{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000649 const char *dot;
650 PyObject *modulename = NULL;
651 PyObject *classname = NULL;
652 PyObject *mydict = NULL;
653 PyObject *bases = NULL;
654 PyObject *result = NULL;
655 dot = strrchr(name, '.');
656 if (dot == NULL) {
657 PyErr_SetString(PyExc_SystemError,
658 "PyErr_NewException: name must be module.class");
659 return NULL;
660 }
661 if (base == NULL)
662 base = PyExc_Exception;
663 if (dict == NULL) {
664 dict = mydict = PyDict_New();
665 if (dict == NULL)
666 goto failure;
667 }
668 if (PyDict_GetItemString(dict, "__module__") == NULL) {
669 modulename = PyUnicode_FromStringAndSize(name,
670 (Py_ssize_t)(dot-name));
671 if (modulename == NULL)
672 goto failure;
673 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
674 goto failure;
675 }
676 if (PyTuple_Check(base)) {
677 bases = base;
678 /* INCREF as we create a new ref in the else branch */
679 Py_INCREF(bases);
680 } else {
681 bases = PyTuple_Pack(1, base);
682 if (bases == NULL)
683 goto failure;
684 }
685 /* Create a real new-style class. */
686 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
687 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000688 failure:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000689 Py_XDECREF(bases);
690 Py_XDECREF(mydict);
691 Py_XDECREF(classname);
692 Py_XDECREF(modulename);
693 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000694}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000695
696/* Call when an exception has occurred but there is no way for Python
697 to handle it. Examples: exception in __del__ or during GC. */
698void
699PyErr_WriteUnraisable(PyObject *obj)
700{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000701 PyObject *f, *t, *v, *tb;
702 PyErr_Fetch(&t, &v, &tb);
703 f = PySys_GetObject("stderr");
704 if (f != NULL && f != Py_None) {
705 PyFile_WriteString("Exception ", f);
706 if (t) {
707 PyObject* moduleName;
708 char* className;
709 assert(PyExceptionClass_Check(t));
710 className = PyExceptionClass_Name(t);
711 if (className != NULL) {
712 char *dot = strrchr(className, '.');
713 if (dot != NULL)
714 className = dot+1;
715 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000716
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000717 moduleName = PyObject_GetAttrString(t, "__module__");
718 if (moduleName == NULL)
719 PyFile_WriteString("<unknown>", f);
720 else {
721 char* modstr = _PyUnicode_AsString(moduleName);
722 if (modstr &&
723 strcmp(modstr, "builtins") != 0)
724 {
725 PyFile_WriteString(modstr, f);
726 PyFile_WriteString(".", f);
727 }
728 }
729 if (className == NULL)
730 PyFile_WriteString("<unknown>", f);
731 else
732 PyFile_WriteString(className, f);
733 if (v && v != Py_None) {
734 PyFile_WriteString(": ", f);
735 PyFile_WriteObject(v, f, 0);
736 }
737 Py_XDECREF(moduleName);
738 }
739 PyFile_WriteString(" in ", f);
740 PyFile_WriteObject(obj, f, 0);
741 PyFile_WriteString(" ignored\n", f);
742 PyErr_Clear(); /* Just in case */
743 }
744 Py_XDECREF(t);
745 Py_XDECREF(v);
746 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000747}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000748
Armin Rigo092381a2003-10-25 14:29:27 +0000749extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000750
Guido van Rossum2fd45652001-02-28 21:46:24 +0000751
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000752/* Set file and line information for the current exception.
753 If the exception is not a SyntaxError, also sets additional attributes
754 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000755
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000756void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000757PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000758{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000759 PyObject *exc, *v, *tb, *tmp;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000760
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000761 /* add attributes for the line number and filename for the error */
762 PyErr_Fetch(&exc, &v, &tb);
763 PyErr_NormalizeException(&exc, &v, &tb);
764 /* XXX check that it is, indeed, a syntax error. It might not
765 * be, though. */
766 tmp = PyLong_FromLong(lineno);
767 if (tmp == NULL)
768 PyErr_Clear();
769 else {
770 if (PyObject_SetAttrString(v, "lineno", tmp))
771 PyErr_Clear();
772 Py_DECREF(tmp);
773 }
774 if (filename != NULL) {
775 tmp = PyUnicode_FromString(filename);
776 if (tmp == NULL)
777 PyErr_Clear();
778 else {
779 if (PyObject_SetAttrString(v, "filename", tmp))
780 PyErr_Clear();
781 Py_DECREF(tmp);
782 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000783
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000784 tmp = PyErr_ProgramText(filename, lineno);
785 if (tmp) {
786 if (PyObject_SetAttrString(v, "text", tmp))
787 PyErr_Clear();
788 Py_DECREF(tmp);
789 }
790 }
791 if (PyObject_SetAttrString(v, "offset", Py_None)) {
792 PyErr_Clear();
793 }
794 if (exc != PyExc_SyntaxError) {
795 if (!PyObject_HasAttrString(v, "msg")) {
796 tmp = PyObject_Str(v);
797 if (tmp) {
798 if (PyObject_SetAttrString(v, "msg", tmp))
799 PyErr_Clear();
800 Py_DECREF(tmp);
801 } else {
802 PyErr_Clear();
803 }
804 }
805 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
806 if (PyObject_SetAttrString(v, "print_file_and_line",
807 Py_None))
808 PyErr_Clear();
809 }
810 }
811 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000812}
813
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000814/* Attempt to load the line of text that the exception refers to. If it
815 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000816
817 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000818 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000819
820PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000821PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000822{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000823 FILE *fp;
824 int i;
825 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000826
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000827 if (filename == NULL || *filename == '\0' || lineno <= 0)
828 return NULL;
829 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
830 if (fp == NULL)
831 return NULL;
832 for (i = 0; i < lineno; i++) {
833 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
834 do {
835 *pLastChar = '\0';
836 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
837 fp, NULL) == NULL)
838 break;
839 /* fgets read *something*; if it didn't get as
840 far as pLastChar, it must have found a newline
841 or hit the end of the file; if pLastChar is \n,
842 it obviously found a newline; else we haven't
843 yet seen a newline, so must continue */
844 } while (*pLastChar != '\0' && *pLastChar != '\n');
845 }
846 fclose(fp);
847 if (i == lineno) {
848 char *p = linebuf;
849 PyObject *res;
850 while (*p == ' ' || *p == '\t' || *p == '\014')
851 p++;
852 res = PyUnicode_FromString(p);
853 if (res == NULL)
854 PyErr_Clear();
855 return res;
856 }
857 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000858}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000859
860#ifdef __cplusplus
861}
862#endif