2010-03-24 33 views

Trả lời

7

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ệ.

+0

Cảm ơn - đây chính xác là những gì tôi đang tìm kiếm. –

Các vấn đề liên quan