BSD 4_3 development
[unix-history] / usr / lib / lisp / manual / ch10.r
CommitLineData
f9a8037d
C
1
2
3
4
5
6
7
8 CHAPTER 10
9
10
11 Exception Handling
12
13
14
15
16
17
18 10.1. Errset and Error Handler Functions
19
20 FRANZ LISP allows the user to handle in a number
21 of ways the errors which arise during computation.
22 One way is through the use of the _\be_\br_\br_\bs_\be_\bt function. If
23 an error occurs during the evaluation of the _\be_\br_\br_\bs_\be_\bt's
24 first argument, then the locus of control will return
25 to the errset which will return nil (except in special
26 cases, such as _\be_\br_\br). The other method of error han-
27 dling is through an error handler function. When an
28 error occurs, the error handler is called and is given
29 as an argument a description of the error which just
30 occurred. The error handler may take one of the fol-
31 lowing actions:
32
33 (1) it could take some drastic action like a _\br_\be_\bs_\be_\bt or
34 a _\bt_\bh_\br_\bo_\bw.
35
36 (2) it could, assuming that the error is continuable,
37 return to the function which noticed the error.
38 The error handler indicates that it wants to
39 return a value from the error by returning a list
40 whose _\bc_\ba_\br is the value it wants to return.
41
42 (3) it could decide not to handle the error and
43 return a non-list to indicate this fact.
44
45
46
47 10.2. The Anatomy of an error
48
49 Each error is described by a list of these items:
50
51 (1) error type - This is a symbol which indicates the
52 general classification of the error. This clas-
53 sification may determine which function handles
54 this error.
55
56 (2) unique id - This is a fixnum unique to this
57 error.
58
59 (3) continuable - If this is non-nil then this error
60 is continuable. There are some who feel that
61
62
63Exception Handling 10-1
64
65
66
67
68
69
70
71Exception Handling 10-2
72
73
74 every error should be continuable and the reason
75 that some (in fact most) errors in FRANZ LISP are
76 not continuable is due to the laziness of the
77 programmers.
78
79 (4) message string - This is a symbol whose print
80 name is a message describing the error.
81
82 (5) data - There may be from zero to three lisp
83 values which help describe this particular
84 error. For example, the unbound variable error
85 contains one datum value, the symbol whose value
86 is unbound. The list describing that error might
87 look like:
88 (ER%misc 0 t |Unbound Variable:| foobar)
89
90
91
92 10.3. Error handling algorithm
93
94 This is the sequence of operations which is done
95 when an error occurs:
96
97 (1) If the symbol ER%all has a non nil value then
98 this value is the name of an error handler func-
99 tion. That function is called with a description
100 of the error. If that function returns (and of
101 course it may choose not to) and the value is a
102 list and this error is continuable, then we
103 return the _\bc_\ba_\br of the list to the function which
104 called the error. Presumably the function will
105 use this value to retry the operation. On the
106 other hand, if the error handler returns a non
107 list, then it has chosen not to handle this
108 error, so we go on to step (2). Something spe-
109 cial happens before we call the ER%all error
110 handler which does not happen in any of the other
111 cases we will describe below. To help insure
112 that we don't get infinitely recursive errors if
113 ER%all is set to a bad value, the value of ER%all
114 is set to nil before the handler is called. Thus
115 it is the responsibility of the ER%all handler to
116 `reenable' itself by storing its name in ER%all.
117
118 (2) Next the specific error handler for the type of
119 error which just occurred is called (if one
120 exists) to see if it wants to handle the error.
121 The names of the handlers for the specific types
122 of errors are stored as the values of the symbols
123 whose names are the types. For example the
124 handler for miscellaneous errors is stored as the
125 value of ER%misc. Of course, if ER%misc has a
126 value of nil, then there is no error handler for
127
128
129 Printed: July 21, 1983
130
131
132
133
134
135
136
137Exception Handling 10-3
138
139
140 this type of error. Appendix B contains list of
141 all error types. The process of classifying the
142 errors is not complete and thus most errors are
143 lumped into the ER%misc category. Just as in
144 step (1), the error handler function may choose
145 not to handle the error by returning a non-list,
146 and then we go to step (3).
147
148 (3) Next a check is made to see if there is an _\be_\br_\br_\bs_\be_\bt
149 surrounding this error. If so the second argu-
150 ment to the _\be_\br_\br_\bs_\be_\bt call is examined. If the
151 second argument was not given or is non nil then
152 the error message associated with this error is
153 printed. Finally the stack is popped to the
154 context of the _\be_\br_\br_\bs_\be_\bt and then the _\be_\br_\br_\bs_\be_\bt returns
155 nil. If there was no _\be_\br_\br_\bs_\be_\bt we go to step (4).
156
157 (4) If the symbol ER%tpl has a value then it is the
158 name of an error handler which is called in a
159 manner similar to that discussed above. If it
160 chooses not to handle the error, we go to step
161 (5).
162
163 (5) At this point it has been determined that the
164 user doesn't want to handle this error. Thus the
165 error message is printed out and a _\br_\be_\bs_\be_\bt is done
166 to send the flow of control to the top-level.
167
168 To summarize the error handling system: When an
169 error occurs, you have two chances to handle it before
170 the search for an _\be_\br_\br_\bs_\be_\bt is done. Then, if there is
171 no _\be_\br_\br_\bs_\be_\bt, you have one more chance to handle the
172 error before control jumps to the top level. Every
173 error handler works in the same way: It is given a
174 description of the error (as described in the previous
175 section). It may or may not return. If it returns,
176 then it returns either a list or a non-list. If it
177 returns a list and the error is continuable, then the
178 _\bc_\ba_\br of the list is returned to the function which
179 noticed the error. Otherwise the error handler has
180 decided not to handle the error and we go on to some-
181 thing else.
182
183
184
185 10.4. Default aids
186
187 There are two standard error handlers which will
188 probably handle the needs of most users. One of these
189 is the lisp coded function _\bb_\br_\be_\ba_\bk-_\be_\br_\br-_\bh_\ba_\bn_\bd_\bl_\be_\br which is
190 the default value of ER%tpl. Thus when all other
191 handlers have ignored an error, _\bb_\br_\be_\ba_\bk-_\be_\br_\br-_\bh_\ba_\bn_\bd_\bl_\be_\br will
192 take over. It will print out the error message and go
193
194
195 Printed: July 21, 1983
196
197
198
199
200
201
202
203Exception Handling 10-4
204
205
206 into a read-eval-print loop. The other standard error
207 handler is _\bd_\be_\bb_\bu_\bg-_\be_\br_\br-_\bh_\ba_\bn_\bd_\bl_\be_\br. This handler is
208 designed to be connected to ER%alland is useful if
209 your program uses _\be_\br_\br_\bs_\be_\bt and you want to look at the
210 error before it is thrown up to the _\be_\br_\br_\bs_\be_\bt.
211
212
213
214 10.5. Autoloading
215
216 When _\be_\bv_\ba_\bl, _\ba_\bp_\bp_\bl_\by or _\bf_\bu_\bn_\bc_\ba_\bl_\bl are told to call an
217 undefined function, an ER%undef error is signaled.
218 The default handler for this error is _\bu_\bn_\bd_\be_\bf-_\bf_\bu_\bn_\bc-
219 _\bh_\ba_\bn_\bd_\bl_\be_\br. This function checks the property list of
220 the undefined function for the indicator autoload. If
221 present, the value of that indicator should be the
222 name of the file which contains the definition of the
223 undefined function. _\bU_\bn_\bd_\be_\bf-_\bf_\bu_\bn_\bc-_\bh_\ba_\bn_\bd_\bl_\be_\br will load the
224 file and check if it has defined the function which
225 caused the error. If it has, the error handler will
226 return and the computation will continue as if the
227 error did not occur. This provides a way for the user
228 to tell the lisp system about the location of commonly
229 used functions. The trace package sets up an autoload
230 property to point to /usr/lib/lisp/trace.
231
232
233
234 10.6. Interrupt processing
235
236 The UNIX operating system provides one user
237 interrupt character which defaults to ^C.[] The user
238 may select a lisp function to run when an interrupt
239 occurs. Since this interrupt could occur at any time,
240 and in particular could occur at a time when the
241 internal stack pointers were in an inconsistent state,
242 the processing of the interrupt may be delayed until a
243 safe time. When the first ^C is typed, the lisp sys-
244 tem sets a flag that an interrupt has been requested.
245 This flag is checked at safe places within the inter-
246 preter and in the _\bq_\bl_\bi_\bn_\bk_\be_\br function. If the lisp sys-
247 tem doesn't respond to the first ^C, another ^C should
248 be typed. This will cause all of the transfer tables
249 to be cleared forcing all calls from compiled code to
250 go through the _\bq_\bl_\bi_\bn_\bk_\be_\br function where the interrupt
251 flag will be checked. If the lisp system still
252 doesn't respond, a third ^C will cause an immediate
253 interrupt. This interrupt will not necessarily be in
254____________________
255\e9 []Actually there are two but the lisp system does not al-
256low you to catch the QUIT interrupt.
257
258
259
260\e9 Printed: July 21, 1983
261
262
263
264
265
266
267
268Exception Handling 10-5
269
270
271 a safe place so the user should _\br_\be_\bs_\be_\bt the lisp system
272 as soon as possible.
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323\e9
324
325\e9 Printed: July 21, 1983
326
327
328