Next: unwind returnable, Previous: unwind except 2, Up: unwind [Contents][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.
(call/cc (lambda (escape) (with-exception-handler escape (lambda () (with-exception-handler (lambda (E) (raise 2)) (lambda () (raise 1))))))) ⇒ 2 ;;The originally raised value 1 is lost!
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 (only (mmck checks) with-result add-result)) (with-result (guard (E (else (add-result 'guard-else) E)) (with-unwind-handler (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))
Next: unwind returnable, Previous: unwind except 2, Up: unwind [Contents][Index]
This document describes version 0.1.0-devel.1 of MMCK Exceptional Conditions.