Ngữ nghĩa của guard
là:
(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)))
Có một phụ else
khoản mà chúng ta không sử dụng ở đây. Mẫu sau đây mô phỏng các ngoại lệ có thể được nâng lên bởi các hoạt động IO của tệp thông thường. Chúng tôi cài đặt một guard
để xử lý các trường hợp ngoại lệ:
(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)))
Chạy thử:
> (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
Có một mô tả chi tiết xử lý với ví dụ mã trong Chapter 7 của R6RS ngoại lệ.
Nguồn
2010-03-25 07:25:57
Cảm ơn - đây chính xác là những gì tôi đang tìm kiếm. –