[plt-scheme] restart exception handling?
Matthew Flatt wrote:
> Exceptions are typically raised (both in the core and in Scheme code)
> with code like this:
>
> (define (mega-fun x y z)
> (unless (integer? x)
> (raise-type-error 'mega-fun "integer" x))
> (unless (list? y)
> (raise-type-error 'mega-fun "list" y))
> (for-each (lambda (e)
> (when (equal? e x)
> (error 'mega-fun "cannot include val in list: ~e" x)))
> y)
> ...)
>
> To make those exceptions continuable, the function has to be written in
> a different way, and often that's a pain:
>
> (define (mega-fun x y z)
> (if (not (integer? x))
> (raise-continuable-type-error 'mega-fun "integer" x))
> (if (not (list? y))
> (raise-continuable-type-error 'mega-fun "list" y))
> ((let/ec esc
> (for-each (lambda (e)
> (when (equal? e x)
> (esc
> (lambda ()
> (continuable-error
> 'mega-fun
> "cannot include val in list: ~e"
> x)))))
> y)
> (lambda () ...))))
>
Thanks very much for the explanations.
Is there a reason why each exception should be thrown in tail position
with respect to the function? Is that the convention for continuable
exceptions?
Could you please elaborate on why you couldn't (or shouldn't) just
replace "raise-type-error" with "raise-continuable-type-error"?
Thanks,
Dave