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.
Gracias - esto es exactamente lo que estaba buscando. –