Mercurial > cpython-lru_cache-weakref
annotate Python/errors.c @ 2019:9e3469c0ed75 legacy-trunk
Added hook for better mac error messages.
| author | Jack Jansen <jack.jansen@cwi.nl> |
|---|---|
| date | Wed, 14 Dec 1994 12:54:54 +0000 |
| parents | a70883803338 |
| children | d7e91437f0a2 |
| rev | line source |
|---|---|
| 145 | 1 /*********************************************************** |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
2 Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, |
|
1252
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
3 Amsterdam, 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 |
|
2019
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
63 #ifdef macintosh |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
64 /* |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
65 ** 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
|
66 ** 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
|
67 ** in ANSI |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
68 */ |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
69 #define strerror macstrerror |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
70 #include "macdefs.h" /* For CW to find EINTR */ |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
71 #endif /* macintosh */ |
|
9e3469c0ed75
Added hook for better mac error messages.
Jack Jansen <jack.jansen@cwi.nl>
parents:
2003
diff
changeset
|
72 |
|
59
433f52d1d958
Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents:
37
diff
changeset
|
73 extern char *strerror PROTO((int)); |
|
433f52d1d958
Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents:
37
diff
changeset
|
74 |
| 6 | 75 /* Last exception stored by err_setval() */ |
| 76 | |
| 77 static object *last_exception; | |
| 78 static object *last_exc_val; | |
| 79 | |
| 80 void | |
| 81 err_setval(exception, value) | |
| 82 object *exception; | |
| 83 object *value; | |
| 84 { | |
|
2003
a70883803338
call err_clear in err_setval
Guido van Rossum <guido@python.org>
parents:
1912
diff
changeset
|
85 err_clear(); |
|
a70883803338
call err_clear in err_setval
Guido van Rossum <guido@python.org>
parents:
1912
diff
changeset
|
86 |
| 86 | 87 XINCREF(exception); |
| 6 | 88 last_exception = exception; |
| 89 | |
| 86 | 90 XINCREF(value); |
| 6 | 91 last_exc_val = value; |
| 92 } | |
| 93 | |
| 94 void | |
| 95 err_set(exception) | |
| 96 object *exception; | |
| 97 { | |
| 98 err_setval(exception, (object *)NULL); | |
| 99 } | |
| 100 | |
| 101 void | |
| 102 err_setstr(exception, string) | |
| 103 object *exception; | |
| 104 char *string; | |
| 105 { | |
| 106 object *value = newstringobject(string); | |
| 107 err_setval(exception, value); | |
| 86 | 108 XDECREF(value); |
| 6 | 109 } |
| 110 | |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
111 |
|
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
112 object * |
| 6 | 113 err_occurred() |
| 114 { | |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
115 return last_exception; |
| 6 | 116 } |
| 117 | |
| 118 void | |
| 119 err_get(p_exc, p_val) | |
| 120 object **p_exc; | |
| 121 object **p_val; | |
| 122 { | |
| 123 *p_exc = last_exception; | |
| 124 last_exception = NULL; | |
| 125 *p_val = last_exc_val; | |
| 126 last_exc_val = NULL; | |
| 127 } | |
| 128 | |
| 129 void | |
| 130 err_clear() | |
| 131 { | |
|
1912
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
132 object *tb; |
| 86 | 133 XDECREF(last_exception); |
| 134 last_exception = NULL; | |
| 135 XDECREF(last_exc_val); | |
| 136 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
|
137 /* 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
|
138 tb = tb_fetch(); |
|
ada19aaaf8c0
* Python/errors.c (err_clear): clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1832
diff
changeset
|
139 XDECREF(tb); |
| 6 | 140 } |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
141 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
142 /* 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
|
143 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
144 int |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
145 err_badarg() |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
146 { |
|
66
46cb14aec10a
Reformulated err_badarg error message.
Guido van Rossum <guido@python.org>
parents:
59
diff
changeset
|
147 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
|
148 return 0; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
149 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
150 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
151 object * |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
152 err_nomem() |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
153 { |
| 86 | 154 err_set(MemoryError); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
155 return NULL; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
156 } |
|
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 object * |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
159 err_errno(exc) |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
160 object *exc; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
161 { |
|
390
172aa2c3e734
Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
162 object *v; |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
163 int i = errno; |
|
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
164 if (i == EINTR && sigcheck()) |
|
390
172aa2c3e734
Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
165 return NULL; |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
166 v = mkvalue("(is)", i, strerror(i)); |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
167 if (v != NULL) { |
|
1252
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
168 err_setval(exc, v); |
|
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
169 DECREF(v); |
|
9
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 return NULL; |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
172 } |
| 22 | 173 |
| 174 void | |
| 175 err_badcall() | |
| 176 { | |
| 177 err_setstr(SystemError, "bad argument to internal function"); | |
| 178 } |
