Annotation of 42BSD/ucb/lisp/lisplib/manual/ch10.r, revision 1.1.1.1

1.1       root        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 _e_r_r_s_e_t function.  If
                     23:       an  error occurs during the evaluation of the _e_r_r_s_e_t'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 _e_r_r).  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 _r_e_s_e_t or
                     34:            a _t_h_r_o_w.
                     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 _c_a_r 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: 
                     63: Exception Handling                                      10-1
                     64: 
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: 
                     71: Exception 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 _c_a_r 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: 
                    137: Exception 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 _e_r_r_s_e_t
                    149:            surrounding  this  error.  If so the second argu-
                    150:            ment to the  _e_r_r_s_e_t  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 _e_r_r_s_e_t and then the _e_r_r_s_e_t returns
                    155:            nil.  If there was no _e_r_r_s_e_t 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 _r_e_s_e_t 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 _e_r_r_s_e_t is done.  Then, if  there  is
                    171:       no  _e_r_r_s_e_t,  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:       _c_a_r 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 _b_r_e_a_k-_e_r_r-_h_a_n_d_l_e_r which  is
                    190:       the  default  value  of  ER%tpl.   Thus when all other
                    191:       handlers have ignored an error, _b_r_e_a_k-_e_r_r-_h_a_n_d_l_e_r 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: 
                    203: Exception Handling                                      10-4
                    204: 
                    205: 
                    206:       into a read-eval-print loop.  The other standard error
                    207:       handler   is   _d_e_b_u_g-_e_r_r-_h_a_n_d_l_e_r.    This  handler  is
                    208:       designed to be connected to  ER%alland  is  useful  if
                    209:       your  program  uses _e_r_r_s_e_t and you want to look at the
                    210:       error  before it is thrown up to the _e_r_r_s_e_t.
                    211: 
                    212: 
                    213: 
                    214:    10.5.  Autoloading
                    215: 
                    216:            When _e_v_a_l, _a_p_p_l_y or _f_u_n_c_a_l_l are told to  call  an
                    217:       undefined  function,  an  ER%undef  error is signaled.
                    218:       The default handler  for  this  error  is  _u_n_d_e_f-_f_u_n_c-
                    219:       _h_a_n_d_l_e_r.   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.  _U_n_d_e_f-_f_u_n_c-_h_a_n_d_l_e_r 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 _q_l_i_n_k_e_r 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  _q_l_i_n_k_e_r 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: 9   []Actually there are two but the lisp system does not al-
                    256: low you to catch the QUIT interrupt.
                    257: 
                    258: 
                    259: 
                    260: 9                                      Printed: July 21, 1983
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 
                    266: 
                    267: 
                    268: Exception Handling                                      10-5
                    269: 
                    270: 
                    271:       a safe place so the user should _r_e_s_e_t 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: 9
                    324: 
                    325: 9                                      Printed: July 21, 1983
                    326: 
                    327: 
                    328: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.