Semantics guard :
(guard (exception-object ((condition-1-to-test-exception-object) (action-to-take) ((condition-2-to-test-exception-object) (action-to-take) ((condition-N-to-test-exception-object) (action-to-take) (else (action-for-unknown-exception)))
There is a helper else clause that we do not use here. The following example models exceptions that can be caused by typical file I / O. We set guard to handle exceptions:
(define mode 0) (define (open-file) (if (= mode 1) (raise 'file-open-error) (display "file opened\n"))) (define (read-file) (if (= mode 2) (raise 'file-read-error) (display "file read\n"))) (define (close-file) (if (= mode 3) (raise 'file-close-error) (display "file closed\n"))) (define (update-mode) (if (< mode 3) (set! mode (+ mode 1)) (set! mode 0))) (define (file-operations) (open-file) (read-file) (close-file) (update-mode)) (define (guard-demo) (guard (ex ((eq? ex 'file-open-error) (display "error: failed to open file ") (update-mode)) ((eq? ex 'file-read-error) (display "error: failed to read file ") (update-mode)) (else (display "Unknown error") (update-mode))) (file-operations)))
Testing:
> (guard-demo) file opened file read file closed > (guard-demo) error: failed to open file > (guard-demo) file opened error: failed to read file > (guard-demo) file opened file read Unknown error > (guard-demo) file opened file read file closed
There is a detailed description of exception handling with sample code in Chapter 7 of R6RS.
Vijay mathew
source share