[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Scheme-reports] 4.2.7. Exception Handling



On Fri, 20 May 2011 05:12:34 -0400, Andy Wingo <wingo@x> wrote:

> Here is an implementation of `guard' which does evaluate the predicates
> in the raise handler, the bodies with the continuation of the `guard',
> and re-raises from within `raise', but without rewinding.

If you do not re-establish the continuation of the raise, then you affect  
the intended behavior of the enclosing exception handlers. Consider the  
following:

Chez Scheme Version 8.3
Copyright (c) 1985-2011 Cadence Research Systems

> (define (print-state) (printf "State.\n"))
> (define debug? (make-parameter #f))
> (with-exception-handler
     (lambda (c)
       (when (debug?) (print-state))
       (display-condition c)
       (reset))
     (lambda ()
       (guard
         (c
           [(warning? c)
            (when (debug?) (display-condition c))])
         (parameterize ([debug? #t])
           (raise (make-error))))))
State.
Exception occurred with condition components:
   0. &error
>

This is just an example, but imagine a more complicated exception handler,  
such as one that captures its continuation and so forth. I've written such  
things, such as a handler that encloses a number of other things that, if  
it receives a recoverable error, such as a network failure that can be  
re-established, will pass back a new value. If there was a guard inside of  
these (and there often is), then the continuation would not be what I  
expect, and the value would be passed somewhere else, which breaks my  
program. In other words, just inserting a guard somewhere in a program  
should not alter the behavior of the program when the guard can't handle  
an object.

	Aaron W. Hsu

-- 
Programming is just another word for the lost art of thinking.

_______________________________________________
Scheme-reports mailing list
Scheme-reports@x
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports