2010-03-24 10 views

Respuesta

7

La semántica de guard es:

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

Hay una cláusula de else auxiliar que no usamos aquí. La siguiente muestra simula excepciones que podrían surgir con las operaciones típicas de archivo IO. Instalamos un guard para manejar las excepciones: plazo

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

prueba:

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

Hay una descripción detallada de manejar con el ejemplo de código en Chapter 7 de R6RS excepción.

+0

Gracias - esto es exactamente lo que estaba buscando. –

Cuestiones relacionadas