blob: c33bd13bde600005a32e71e615aa5710b21a6a52 [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
Guido van Rossum743007d1999-04-21 15:27:31 +000013#include "windows.h"
14#include "winbase.h"
15#endif
16
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000017#include <ctype.h>
18
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000020PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000021{
Guido van Rossum885553e1998-12-21 18:33:30 +000022 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000023 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024
Guido van Rossuma027efa1997-05-05 20:56:21 +000025 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
26 /* XXX Should never happen -- fatal error instead? */
Guido van Rossum1a5e21e2006-02-28 21:57:43 +000027 /* Well, it could be None. */
Guido van Rossuma027efa1997-05-05 20:56:21 +000028 Py_DECREF(traceback);
29 traceback = NULL;
30 }
31
32 /* Save these in locals to safeguard against recursive
33 invocation through Py_XDECREF */
34 oldtype = tstate->curexc_type;
35 oldvalue = tstate->curexc_value;
36 oldtraceback = tstate->curexc_traceback;
37
38 tstate->curexc_type = type;
39 tstate->curexc_value = value;
40 tstate->curexc_traceback = traceback;
41
42 Py_XDECREF(oldtype);
43 Py_XDECREF(oldvalue);
44 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045}
46
47void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000048PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
Guido van Rossum373c8691997-04-29 18:22:47 +000050 Py_XINCREF(exception);
51 Py_XINCREF(value);
52 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053}
54
55void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000056PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossum373c8691997-04-29 18:22:47 +000058 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059}
60
61void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063{
Guido van Rossum373c8691997-04-29 18:22:47 +000064 PyObject *value = PyString_FromString(string);
65 PyErr_SetObject(exception, value);
66 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067}
68
Guido van Rossum3a241811994-08-29 12:14:12 +000069
Guido van Rossum373c8691997-04-29 18:22:47 +000070PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000071PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072{
Tim Peters024da352001-05-30 06:09:50 +000073 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000074
75 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076}
77
Barry Warsawc0dc92a1997-08-22 21:22:58 +000078
79int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000081{
Barry Warsawfa5c3152000-05-02 19:27:51 +000082 if (err == NULL || exc == NULL) {
83 /* maybe caused by "import exceptions" that failed early on */
84 return 0;
85 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000086 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +000087 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +000088 n = PyTuple_Size(exc);
89 for (i = 0; i < n; i++) {
90 /* Test recursively */
91 if (PyErr_GivenExceptionMatches(
92 err, PyTuple_GET_ITEM(exc, i)))
93 {
94 return 1;
95 }
96 }
97 return 0;
98 }
99 /* err might be an instance, so check its class. */
100 if (PyInstance_Check(err))
101 err = (PyObject*)((PyInstanceObject*)err)->in_class;
102
103 if (PyClass_Check(err) && PyClass_Check(exc))
104 return PyClass_IsSubclass(err, exc);
105
106 return err == exc;
107}
Guido van Rossum743007d1999-04-21 15:27:31 +0000108
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000109
110int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000111PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000112{
113 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
114}
115
116
117/* Used in many places to normalize a raised exception, including in
118 eval_code2(), do_raise(), and PyErr_Print()
119*/
120void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000122{
123 PyObject *type = *exc;
124 PyObject *value = *val;
125 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000126 PyObject *initial_tb = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000127
Guido van Rossumed473a42000-08-07 19:18:27 +0000128 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000129 /* There was no exception, so nothing to do. */
130 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000131 }
132
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000133 /* If PyErr_SetNone() was used, the value will have been actually
134 set to NULL.
135 */
136 if (!value) {
137 value = Py_None;
138 Py_INCREF(value);
139 }
140
141 if (PyInstance_Check(value))
142 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
143
144 /* Normalize the exception so that if the type is a class, the
145 value will be an instance.
146 */
147 if (PyClass_Check(type)) {
148 /* if the value was not an instance, or is not an instance
149 whose class is (or is derived from) type, then use the
150 value as an argument to instantiation of the type
151 class.
152 */
153 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
154 PyObject *args, *res;
155
156 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000157 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000158 else if (PyTuple_Check(value)) {
159 Py_INCREF(value);
160 args = value;
161 }
162 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000163 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000164
165 if (args == NULL)
166 goto finally;
167 res = PyEval_CallObject(type, args);
168 Py_DECREF(args);
169 if (res == NULL)
170 goto finally;
171 Py_DECREF(value);
172 value = res;
173 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000174 /* if the class of the instance doesn't exactly match the
175 class of the type, believe the instance
176 */
177 else if (inclass != type) {
178 Py_DECREF(type);
179 type = inclass;
180 Py_INCREF(type);
181 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000182 }
183 *exc = type;
184 *val = value;
185 return;
186finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000187 Py_DECREF(type);
188 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000189 /* If the new exception doesn't set a traceback and the old
190 exception had a traceback, use the old traceback for the
191 new exception. It's better than nothing.
192 */
193 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000194 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000195 if (initial_tb != NULL) {
196 if (*tb == NULL)
197 *tb = initial_tb;
198 else
199 Py_DECREF(initial_tb);
200 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000201 /* normalize recursively */
202 PyErr_NormalizeException(exc, val, tb);
203}
204
205
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000207PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000209 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000210
211 *p_type = tstate->curexc_type;
212 *p_value = tstate->curexc_value;
213 *p_traceback = tstate->curexc_traceback;
214
215 tstate->curexc_type = NULL;
216 tstate->curexc_value = NULL;
217 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218}
219
220void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000223 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000225
226/* Convenience functions to set a type error exception and return 0 */
227
228int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000229PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000230{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000232 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000233 return 0;
234}
235
Guido van Rossum373c8691997-04-29 18:22:47 +0000236PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000237PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000238{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000239 if (PyErr_ExceptionMatches(PyExc_MemoryError))
240 /* already current */
241 return NULL;
242
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000243 /* raise the pre-allocated instance if it still exists */
244 if (PyExc_MemoryErrorInst)
245 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
246 else
247 /* this will probably fail since there's no memory and hee,
248 hee, we have to instantiate this class
249 */
250 PyErr_SetNone(PyExc_MemoryError);
251
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000252 return NULL;
253}
254
Guido van Rossum373c8691997-04-29 18:22:47 +0000255PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000256PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000257{
Guido van Rossum373c8691997-04-29 18:22:47 +0000258 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000259 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000260 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000261#ifdef PLAN9
262 char errbuf[ERRMAX];
263#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000264#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000265 char *s_buf = NULL;
Mark Hammond3d61a062002-10-04 00:13:02 +0000266 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000267#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000268#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000269 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000270 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000271#endif
Martin v. Löwis3484a182002-03-09 12:07:51 +0000272#ifdef PLAN9
273 rerrstr(errbuf, sizeof errbuf);
274 s = errbuf;
275#else
Guido van Rossume0e59821998-10-14 20:38:13 +0000276 if (i == 0)
277 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000278 else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000279#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000280 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000281#else
282 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000283 /* Note that the Win32 errors do not lineup with the
284 errno error. So if the error is in the MSVC error
285 table, we use it, otherwise we assume it really _is_
286 a Win32 error code
287 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000288 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000289 s = _sys_errlist[i];
290 }
291 else {
292 int len = FormatMessage(
293 FORMAT_MESSAGE_ALLOCATE_BUFFER |
294 FORMAT_MESSAGE_FROM_SYSTEM |
295 FORMAT_MESSAGE_IGNORE_INSERTS,
296 NULL, /* no message source */
297 i,
298 MAKELANGID(LANG_NEUTRAL,
299 SUBLANG_DEFAULT),
300 /* Default language */
301 (LPTSTR) &s_buf,
302 0, /* size not used */
303 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000304 if (len==0) {
305 /* Only ever seen this in out-of-mem
306 situations */
307 sprintf(s_small_buf, "Windows Error 0x%X", i);
308 s = s_small_buf;
309 s_buf = NULL;
310 } else {
311 s = s_buf;
312 /* remove trailing cr/lf and dots */
313 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
314 s[--len] = '\0';
315 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000316 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000317 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000318#endif /* Unix/Windows */
319#endif /* PLAN 9*/
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000320 if (filenameObject != NULL)
321 v = Py_BuildValue("(isO)", i, s, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000322 else
323 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000324 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000325 PyErr_SetObject(exc, v);
326 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000327 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000328#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000329 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000330#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000331 return NULL;
332}
Guido van Rossum743007d1999-04-21 15:27:31 +0000333
Barry Warsaw97d95151998-07-23 16:05:56 +0000334
335PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000336PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
337{
338 PyObject *name = filename ? PyString_FromString(filename) : NULL;
339 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000340 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000341 return result;
342}
343
344#ifdef Py_WIN_WIDE_FILENAMES
345PyObject *
346PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
347{
348 PyObject *name = filename ?
349 PyUnicode_FromUnicode(filename, wcslen(filename)) :
350 NULL;
351 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
352 Py_XDECREF(name);
353 return result;
354}
355#endif /* Py_WIN_WIDE_FILENAMES */
356
357PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000358PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000359{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000360 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000361}
Guido van Rossum683a0721990-10-21 22:09:12 +0000362
Guido van Rossum795e1892000-02-17 15:19:15 +0000363#ifdef MS_WINDOWS
364/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000365PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000366 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000367 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000368 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000369{
370 int len;
371 char *s;
Mark Hammond3d61a062002-10-04 00:13:02 +0000372 char *s_buf = NULL; /* Free via LocalFree */
373 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
Guido van Rossum795e1892000-02-17 15:19:15 +0000374 PyObject *v;
375 DWORD err = (DWORD)ierr;
376 if (err==0) err = GetLastError();
377 len = FormatMessage(
378 /* Error API error */
379 FORMAT_MESSAGE_ALLOCATE_BUFFER |
380 FORMAT_MESSAGE_FROM_SYSTEM |
381 FORMAT_MESSAGE_IGNORE_INSERTS,
382 NULL, /* no message source */
383 err,
384 MAKELANGID(LANG_NEUTRAL,
385 SUBLANG_DEFAULT), /* Default language */
Mark Hammond3d61a062002-10-04 00:13:02 +0000386 (LPTSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000387 0, /* size not used */
388 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000389 if (len==0) {
390 /* Only seen this in out of mem situations */
391 sprintf(s_small_buf, "Windows Error 0x%X", err);
392 s = s_small_buf;
393 s_buf = NULL;
394 } else {
395 s = s_buf;
396 /* remove trailing cr/lf and dots */
397 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
398 s[--len] = '\0';
399 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000400 if (filenameObject != NULL)
401 v = Py_BuildValue("(isO)", err, s, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000402 else
403 v = Py_BuildValue("(is)", err, s);
404 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000405 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000406 Py_DECREF(v);
407 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000408 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000409 return NULL;
410}
411
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000412PyObject *PyErr_SetExcFromWindowsErrWithFilename(
413 PyObject *exc,
414 int ierr,
415 const char *filename)
416{
417 PyObject *name = filename ? PyString_FromString(filename) : NULL;
418 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
419 ierr,
420 name);
421 Py_XDECREF(name);
422 return ret;
423}
424
425#ifdef Py_WIN_WIDE_FILENAMES
426PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
427 PyObject *exc,
428 int ierr,
429 const Py_UNICODE *filename)
430{
431 PyObject *name = filename ?
432 PyUnicode_FromUnicode(filename, wcslen(filename)) :
433 NULL;
434 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
435 ierr,
436 name);
437 Py_XDECREF(name);
438 return ret;
439}
440#endif /* Py_WIN_WIDE_FILENAMES */
441
Thomas Heller085358a2002-07-29 14:27:41 +0000442PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
443{
444 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
445}
446
Guido van Rossum795e1892000-02-17 15:19:15 +0000447PyObject *PyErr_SetFromWindowsErr(int ierr)
448{
Thomas Heller085358a2002-07-29 14:27:41 +0000449 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
450 ierr, NULL);
451}
452PyObject *PyErr_SetFromWindowsErrWithFilename(
453 int ierr,
454 const char *filename)
455{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000456 PyObject *name = filename ? PyString_FromString(filename) : NULL;
457 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
458 PyExc_WindowsError,
459 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000460 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000461 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000462}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000463
464#ifdef Py_WIN_WIDE_FILENAMES
465PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
466 int ierr,
467 const Py_UNICODE *filename)
468{
469 PyObject *name = filename ?
470 PyUnicode_FromUnicode(filename, wcslen(filename)) :
471 NULL;
472 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
473 PyExc_WindowsError,
474 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000475 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000476 return result;
477}
478#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000479#endif /* MS_WINDOWS */
480
Guido van Rossum683a0721990-10-21 22:09:12 +0000481void
Fred Drake6d63adf2000-08-24 22:38:39 +0000482_PyErr_BadInternalCall(char *filename, int lineno)
483{
484 PyErr_Format(PyExc_SystemError,
485 "%s:%d: bad argument to internal function",
486 filename, lineno);
487}
488
489/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
490 export the entry point for existing object code: */
491#undef PyErr_BadInternalCall
492void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000493PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000494{
Fred Drake6d63adf2000-08-24 22:38:39 +0000495 PyErr_Format(PyExc_SystemError,
496 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000497}
Fred Drake6d63adf2000-08-24 22:38:39 +0000498#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
499
Guido van Rossum1548bac1997-02-14 17:09:47 +0000500
501
Guido van Rossum1548bac1997-02-14 17:09:47 +0000502PyObject *
503PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000504{
505 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000506 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000507
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000508#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000509 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000510#else
511 va_start(vargs);
512#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000513
Barry Warsaw876c8cb2001-08-24 18:35:23 +0000514 string = PyString_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000515 PyErr_SetObject(exception, string);
516 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000517 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000518 return NULL;
519}
Guido van Rossum7617e051997-09-16 18:43:50 +0000520
521
522PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000523PyErr_NewException(char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000524{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000525 char *dot;
526 PyObject *modulename = NULL;
527 PyObject *classname = NULL;
528 PyObject *mydict = NULL;
529 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000530 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000531 dot = strrchr(name, '.');
532 if (dot == NULL) {
533 PyErr_SetString(PyExc_SystemError,
534 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000535 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000536 }
537 if (base == NULL)
538 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000539 if (dict == NULL) {
540 dict = mydict = PyDict_New();
541 if (dict == NULL)
542 goto failure;
543 }
544 if (PyDict_GetItemString(dict, "__module__") == NULL) {
545 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
546 if (modulename == NULL)
547 goto failure;
548 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
549 goto failure;
550 }
551 classname = PyString_FromString(dot+1);
552 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000553 goto failure;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000554 bases = PyTuple_Pack(1, base);
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000555 if (bases == NULL)
556 goto failure;
557 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000558 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000559 Py_XDECREF(bases);
560 Py_XDECREF(mydict);
561 Py_XDECREF(classname);
562 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000563 return result;
564}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000565
566/* Call when an exception has occurred but there is no way for Python
567 to handle it. Examples: exception in __del__ or during GC. */
568void
569PyErr_WriteUnraisable(PyObject *obj)
570{
571 PyObject *f, *t, *v, *tb;
572 PyErr_Fetch(&t, &v, &tb);
573 f = PySys_GetObject("stderr");
574 if (f != NULL) {
575 PyFile_WriteString("Exception ", f);
576 if (t) {
577 PyFile_WriteObject(t, f, Py_PRINT_RAW);
578 if (v && v != Py_None) {
579 PyFile_WriteString(": ", f);
580 PyFile_WriteObject(v, f, 0);
581 }
582 }
583 PyFile_WriteString(" in ", f);
584 PyFile_WriteObject(obj, f, 0);
585 PyFile_WriteString(" ignored\n", f);
586 PyErr_Clear(); /* Just in case */
587 }
588 Py_XDECREF(t);
589 Py_XDECREF(v);
590 Py_XDECREF(tb);
591}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000592
Armin Rigo092381a2003-10-25 14:29:27 +0000593extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000594
595/* Function to issue a warning message; may raise an exception. */
596int
597PyErr_Warn(PyObject *category, char *message)
598{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000599 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000600 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000601
Mark Hammondedd07732003-07-15 23:03:55 +0000602 if (warnings_module != NULL) {
603 dict = PyModule_GetDict(warnings_module);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000604 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000605 }
606 if (func == NULL) {
607 PySys_WriteStderr("warning: %s\n", message);
608 return 0;
609 }
610 else {
611 PyObject *args, *res;
612
613 if (category == NULL)
614 category = PyExc_RuntimeWarning;
615 args = Py_BuildValue("(sO)", message, category);
616 if (args == NULL)
617 return -1;
618 res = PyEval_CallObject(func, args);
619 Py_DECREF(args);
620 if (res == NULL)
621 return -1;
622 Py_DECREF(res);
623 return 0;
624 }
625}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000626
Guido van Rossum2fd45652001-02-28 21:46:24 +0000627
628/* Warning with explicit origin */
629int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000630PyErr_WarnExplicit(PyObject *category, const char *message,
631 const char *filename, int lineno,
632 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000633{
634 PyObject *mod, *dict, *func = NULL;
635
636 mod = PyImport_ImportModule("warnings");
637 if (mod != NULL) {
638 dict = PyModule_GetDict(mod);
639 func = PyDict_GetItemString(dict, "warn_explicit");
640 Py_DECREF(mod);
641 }
642 if (func == NULL) {
643 PySys_WriteStderr("warning: %s\n", message);
644 return 0;
645 }
646 else {
647 PyObject *args, *res;
648
649 if (category == NULL)
650 category = PyExc_RuntimeWarning;
651 if (registry == NULL)
652 registry = Py_None;
653 args = Py_BuildValue("(sOsizO)", message, category,
654 filename, lineno, module, registry);
655 if (args == NULL)
656 return -1;
657 res = PyEval_CallObject(func, args);
658 Py_DECREF(args);
659 if (res == NULL)
660 return -1;
661 Py_DECREF(res);
662 return 0;
663 }
664}
665
666
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000667/* Set file and line information for the current exception.
668 If the exception is not a SyntaxError, also sets additional attributes
669 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000670
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000671void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000672PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000673{
674 PyObject *exc, *v, *tb, *tmp;
675
676 /* add attributes for the line number and filename for the error */
677 PyErr_Fetch(&exc, &v, &tb);
678 PyErr_NormalizeException(&exc, &v, &tb);
679 /* XXX check that it is, indeed, a syntax error */
680 tmp = PyInt_FromLong(lineno);
681 if (tmp == NULL)
682 PyErr_Clear();
683 else {
684 if (PyObject_SetAttrString(v, "lineno", tmp))
685 PyErr_Clear();
686 Py_DECREF(tmp);
687 }
688 if (filename != NULL) {
689 tmp = PyString_FromString(filename);
690 if (tmp == NULL)
691 PyErr_Clear();
692 else {
693 if (PyObject_SetAttrString(v, "filename", tmp))
694 PyErr_Clear();
695 Py_DECREF(tmp);
696 }
697
698 tmp = PyErr_ProgramText(filename, lineno);
699 if (tmp) {
700 PyObject_SetAttrString(v, "text", tmp);
701 Py_DECREF(tmp);
702 }
703 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000704 if (PyObject_SetAttrString(v, "offset", Py_None)) {
705 PyErr_Clear();
706 }
707 if (exc != PyExc_SyntaxError) {
708 if (!PyObject_HasAttrString(v, "msg")) {
709 tmp = PyObject_Str(v);
710 if (tmp) {
711 if (PyObject_SetAttrString(v, "msg", tmp))
712 PyErr_Clear();
713 Py_DECREF(tmp);
714 } else {
715 PyErr_Clear();
716 }
717 }
718 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
719 if (PyObject_SetAttrString(v, "print_file_and_line",
720 Py_None))
721 PyErr_Clear();
722 }
723 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000724 PyErr_Restore(exc, v, tb);
725}
726
727/* com_fetch_program_text will attempt to load the line of text that
728 the exception refers to. If it fails, it will return NULL but will
729 not set an exception.
730
731 XXX The functionality of this function is quite similar to the
732 functionality in tb_displayline() in traceback.c.
733*/
734
735PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000736PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000737{
738 FILE *fp;
739 int i;
740 char linebuf[1000];
741
Tim Petersa7444f42006-02-27 23:29:46 +0000742 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000743 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000744 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000745 if (fp == NULL)
746 return NULL;
747 for (i = 0; i < lineno; i++) {
748 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
749 do {
750 *pLastChar = '\0';
Jack Jansen7b8c7542002-04-14 20:12:41 +0000751 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000752 break;
753 /* fgets read *something*; if it didn't get as
754 far as pLastChar, it must have found a newline
755 or hit the end of the file; if pLastChar is \n,
756 it obviously found a newline; else we haven't
757 yet seen a newline, so must continue */
758 } while (*pLastChar != '\0' && *pLastChar != '\n');
759 }
760 fclose(fp);
761 if (i == lineno) {
762 char *p = linebuf;
763 while (*p == ' ' || *p == '\t' || *p == '\014')
764 p++;
765 return PyString_FromString(p);
766 }
767 return NULL;
768}