Mercurial > cpython-lru_cache-weakref
annotate Python/errors.c @ 2318:99e7ac22bd2e legacy-trunk
mac changes:
- Assume files of types 'PYC ' and 'APPL' are compiled python code
- For mwerks, show status line when program has terminated while
keeping window open.
| author | Jack Jansen <jack.jansen@cwi.nl> |
|---|---|
| date | Mon, 13 Feb 1995 11:44:56 +0000 |
| parents | b40e10bda231 |
| children | c31eaed7798b |
| rev | line source |
|---|---|
| 145 | 1 /*********************************************************** |
|
2062
d0d0a69b5ca3
Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents:
2052
diff
changeset
|
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, |
|
d0d0a69b5ca3
Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents:
2052
diff
changeset
|
3 The Netherlands. |
| 145 | 4 |
| 5 All Rights Reserved | |
| 6 | |
| 7 Permission to use, copy, modify, and distribute this software and its | |
| 8 documentation for any purpose and without fee is hereby granted, | |
| 9 provided that the above copyright notice appear in all copies and that | |
| 10 both that copyright notice and this permission notice appear in | |
| 11 supporting documentation, and that the names of Stichting Mathematisch | |
| 12 Centrum or CWI not be used in advertising or publicity pertaining to | |
| 13 distribution of the software without specific, written prior permission. | |
| 14 | |
| 15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | |
| 16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| 17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | |
| 18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| 19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| 20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
| 21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| 22 | |
| 23 ******************************************************************/ | |
| 24 | |
| 6 | 25 /* Error handling -- see also run.c */ |
| 26 | |
| 27 /* New error handling interface. | |
| 28 | |
| 29 The following problem exists (existed): methods of built-in modules | |
| 30 are called with 'self' and 'args' arguments, but without a context | |
| 31 argument, so they have no way to raise a specific exception. | |
| 32 The same is true for the object implementations: no context argument. | |
| 33 The old convention was to set 'errno' and to return NULL. | |
| 34 The caller (usually call_function() in eval.c) detects the NULL | |
| 35 return value and then calls puterrno(ctx) to turn the errno value | |
| 36 into a true exception. Problems with this approach are: | |
| 37 - it used standard errno values to indicate Python-specific errors, | |
| 86 | 38 but this means that when such an error code is reported by a system |
| 39 call (e.g., in module posix), the user gets a confusing message | |
| 6 | 40 - errno is a global variable, which makes extensions to a multi- |
| 41 threading environment difficult; e.g., in IRIX, multi-threaded | |
| 86 | 42 programs must use the function oserror() instead of looking in errno |
| 6 | 43 - there is no portable way to add new error numbers for specic |
| 44 situations -- the value space for errno is reserved to the OS, yet | |
| 45 the way to turn module-specific errors into a module-specific | |
| 46 exception requires module-specific values for errno | |
| 47 - there is no way to add a more situation-specific message to an | |
| 48 error. | |
| 49 | |
| 50 The new interface solves all these problems. To return an error, a | |
| 86 | 51 built-in function calls err_set(exception), err_setval(exception, |
| 6 | 52 value) or err_setstr(exception, string), and returns NULL. These |
| 53 functions save the value for later use by puterrno(). To adapt this | |
| 54 scheme to a multi-threaded environment, only the implementation of | |
| 55 err_setval() has to be changed. | |
| 56 */ | |
| 57 | |
|
90
5cb843bc87fc
Changed include of <errno.h>
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
58 #include "allobjects.h" |
|
1912
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
59 #include "traceback.h" |
| 6 | 60 |
|
90
5cb843bc87fc
Changed include of <errno.h>
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
61 #include <errno.h> |
| 86 | 62 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
63 #ifndef NT |
|
2019
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
64 #ifdef macintosh |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
65 /* |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
66 ** For the mac, there's a function macstrerror in macosmodule.c. We can't |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
67 ** call it strerror(), though, since that is already defined (for Think C) |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
68 ** in ANSI |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
69 */ |
|
2190
b40e10bda231
Undef strerror on the mac before redefining it
Jack Jansen <jack.jansen@cwi.nl>
parents:
2062
diff
changeset
|
70 #undef strerror |
|
2019
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
71 #define strerror macstrerror |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
72 #include "macdefs.h" /* For CW to find EINTR */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
73 #endif /* !macintosh */ |
|
59
433f52d1d958
Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents:
37
diff
changeset
|
74 extern char *strerror PROTO((int)); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
75 #endif /* !NT */ |
|
59
433f52d1d958
Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents:
37
diff
changeset
|
76 |
| 6 | 77 /* Last exception stored by err_setval() */ |
| 78 | |
| 79 static object *last_exception; | |
| 80 static object *last_exc_val; | |
| 81 | |
| 82 void | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
83 err_restore(exception, value, traceback) |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
84 object *exception; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
85 object *value; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
86 object *traceback; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
87 { |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
88 err_clear(); |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
89 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
90 last_exception = exception; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
91 last_exc_val = value; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
92 (void) tb_store(traceback); |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
93 XDECREF(traceback); |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
94 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
95 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
96 void |
| 6 | 97 err_setval(exception, value) |
| 98 object *exception; | |
| 99 object *value; | |
| 100 { | |
| 86 | 101 XINCREF(exception); |
| 102 XINCREF(value); | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
103 err_restore(exception, value, (object *)NULL); |
| 6 | 104 } |
| 105 | |
| 106 void | |
| 107 err_set(exception) | |
| 108 object *exception; | |
| 109 { | |
| 110 err_setval(exception, (object *)NULL); | |
| 111 } | |
| 112 | |
| 113 void | |
| 114 err_setstr(exception, string) | |
| 115 object *exception; | |
| 116 char *string; | |
| 117 { | |
| 118 object *value = newstringobject(string); | |
| 119 err_setval(exception, value); | |
| 86 | 120 XDECREF(value); |
| 6 | 121 } |
| 122 | |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
123 |
|
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
124 object * |
| 6 | 125 err_occurred() |
| 126 { | |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
127 return last_exception; |
| 6 | 128 } |
| 129 | |
| 130 void | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
131 err_fetch(p_exc, p_val, p_tb) |
| 6 | 132 object **p_exc; |
| 133 object **p_val; | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
134 object **p_tb; |
| 6 | 135 { |
| 136 *p_exc = last_exception; | |
| 137 last_exception = NULL; | |
| 138 *p_val = last_exc_val; | |
| 139 last_exc_val = NULL; | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2019
diff
changeset
|
140 *p_tb = tb_fetch(); |
| 6 | 141 } |
| 142 | |
| 143 void | |
| 144 err_clear() | |
| 145 { | |
|
1912
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
146 object *tb; |
| 86 | 147 XDECREF(last_exception); |
| 148 last_exception = NULL; | |
| 149 XDECREF(last_exc_val); | |
| 150 last_exc_val = NULL; | |
|
1912
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
151 /* Also clear interpreter stack trace */ |
|
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
152 tb = tb_fetch(); |
|
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
153 XDECREF(tb); |
| 6 | 154 } |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
155 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
156 /* Convenience functions to set a type error exception and return 0 */ |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
157 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
158 int |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
159 err_badarg() |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
160 { |
|
66
46cb14aec10a
Reformulated err_badarg error message.
Guido van Rossum <guido@python.org>
parents:
59
diff
changeset
|
161 err_setstr(TypeError, "illegal argument type for built-in operation"); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
162 return 0; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
163 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
164 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
165 object * |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
166 err_nomem() |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
167 { |
| 86 | 168 err_set(MemoryError); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
169 return NULL; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
170 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
171 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
172 object * |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
173 err_errno(exc) |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
174 object *exc; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
175 { |
|
390
172aa2c3e734
Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
176 object *v; |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
177 int i = errno; |
|
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
178 if (i == EINTR && sigcheck()) |
|
390
172aa2c3e734
Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
179 return NULL; |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
180 v = mkvalue("(is)", i, strerror(i)); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
181 if (v != NULL) { |
|
1252
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
182 err_setval(exc, v); |
|
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
183 DECREF(v); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
184 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
185 return NULL; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
186 } |
| 22 | 187 |
| 188 void | |
| 189 err_badcall() | |
| 190 { | |
| 191 err_setstr(SystemError, "bad argument to internal function"); | |
| 192 } |
