Aaha, noted. So the way to stack exception handlers atop of each others are by continuation-capture as you gave an example of in the previous email, here applied to this usecase. Thanks for clarifying!


 (with-exception-handler
  (lambda (e)
    (print "Outer.\n")
    'outer-handler-result)
  (lambda ()
    (continuation-capture
     (lambda (cont)
       (with-exception-handler
        (lambda (e)
          (print "Inner.\n")
          (let ((r (continuation-graft cont (lambda () (raise e)))))
            (print "Passing on " r ".\n")
            r))
        (lambda () (list 'raise-returned: (raise 'err))))))))
 


2013/4/1 Marc Feeley <feeley@iro.umontreal.ca>

On 2013-03-31, at 3:02 PM, Mikael <mikael.rcv@gmail.com> wrote:

> Dear Marc,
>
> (with-exception-handler
>  (lambda (e)
>    (print "Outer.\n")
>    'outer-handler-result)
>  (lambda ()
>    (with-exception-handler
>     (lambda (e)
>       (print "Inner.\n")
>       (let ((r (raise e)))
>         (print "Passing on " r ".\n")
>         r))
>     (lambda () (list 'raise-returned: (raise 'err))))))
>
> prints out "Inner.\n" in an infinite loop currently. Is it not supposed to output
>
> Inner.
> Outer.
> Passing on outer-handled-result.
>
> and then return '(raise-returned: outer-handler-result) ?

That's the correct behavior.  Don't confuse with-exception-catcher (which corresponds to try/catch in other programming languages) and with-exception-handler (which installs an exception handler which will be active when the exception handler is called).

Marc