Как создавать и обрабатывать исключения в схеме R6RS - PullRequest
7 голосов
/ 24 марта 2010

Каков стандартный способ создания и отлова исключений в схеме R6RS? Я ищу синтаксис, который работает в любой версии Scheme (не только PLT), которая реализует R6RS.

Синтаксис R6RS для защиты выглядит так, как будто это может соответствовать всем требованиям, но может кто-нибудь показать мне пример того, как на самом деле его использовать?

1 Ответ

8 голосов
/ 25 марта 2010

Семантика 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, которое мы здесь не используем. В следующем примере имитируются исключения, которые могут быть вызваны типичными операциями ввода-вывода файла. Мы устанавливаем 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

Подробное описание обработки исключений с примером кода приведено в Глава 7 R6RS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...