10

我正在尝试使用 (call-cc) 方法在方案中实现 try-catch 块,但我不确定如何使用它。我找不到任何例子。

发现的例子只包含错误处理,但我想做的是:如果发生错误,方案程序必须向用户发送消息(例如通过显示)而不暂停程序。

那可能吗?

4

2 回答 2

12

通常你会使用with-handlers表格。这使您可以在返回值之前显示错误消息或采取任何其他操作。

#lang racket

(define (foo x)
  (with-handlers ([exn:fail? (lambda (exn)
                               (displayln (exn-message exn))
                               #f)])
    (/ 1 x)))

(foo 1) 
; 1
(foo 0) 
; "/: division by zero" 
; #f

如果出于某种原因你真的想直接使用延续,你可以使用call/ec错误/转义延续而不是一般的call/cc.

文件:

于 2013-05-11T02:43:22.073 回答
10

由于您想捕获所有错误,例如两者都引发的错误,raise并且raise-continuable您需要一个异常处理程序(处理引发的条件)和一个退出继续(以避免继续处理try主体)。的简单语法try是:

(import (rnrs base)            ; define-syntax
        (rnrs exceptions))     ; get `with-exception-handler`

(define-syntax try
  (syntax-rules (catch)
    ((_ body (catch catcher))
     (call-with-current-continuation
      (lambda (exit)
        (with-exception-handler
         (lambda (condition)
           catcher
           (exit condition))
         (lambda () body)))))))

这被用作例如:

> (try (begin (display "one\n")
              (raise 'some-error)
              (display "two\n"))
    (catch (display "error\n")))
one
error
some-error       # the return value.

注意:这是 R6RS(和 R7RS)方案。

于 2013-05-11T02:46:34.963 回答