Next: iklib unwind-protect loops, Previous: iklib unwind-protect except 2, Up: iklib unwind-protect [Index]
When a thunk raises an exception and the current exception handler raises another exception: the original exception is dropped if no specific action is taken. This is a common problem. The following example shows the mechanism.
(import (vicare))
(call/cc
(lambda (escape)
(with-exception-handler
escape
(lambda ()
(with-exception-handler
(lambda (E)
(raise 2))
(lambda ()
(raise 1)))))))
⇒ 2
What happens if ?unwind-handler raises an exception? It was decided that such exceptions are to be blocked and discarded; ?unwind-handler procedures have to take care of themselves, handling their own errors. The following example shows the mechanism.
(import (vicare)
(only (vicare checks)
with-result
add-result))
(with-result
(guard (E (else
(add-result 'guard-else)
E))
(with-unwind-protection
(lambda (why)
(add-result 'cleanup-in)
(raise 2)
(add-result 'cleanup-out))
(lambda ()
(add-result 'thunk-in)
(raise 1)
(add-result 'thunk-out)))))
⇒ (1 (thunk-in cleanup-in guard-else))