2010-03-24 54 views

回答

7

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))) 

有,我們這裏不使用輔助else條款。以下示例模擬典型文件IO操作可能引發的異常。我們安裝guard來處理異常:

(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))) 

試運行:

> (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 

有例外R6RS的Chapter 7與示例代碼處理的詳細說明。

+0

謝謝 - 這正是我一直在尋找的。 – 2010-03-26 16:21:37

相關問題