我正在尝试使用 (call-cc) 方法在方案中实现 try-catch 块,但我不确定如何使用它。我找不到任何例子。
发现的例子只包含错误处理,但我想做的是:如果发生错误,方案程序必须向用户发送消息(例如通过显示)而不暂停程序。
那可能吗?
我正在尝试使用 (call-cc) 方法在方案中实现 try-catch 块,但我不确定如何使用它。我找不到任何例子。
发现的例子只包含错误处理,但我想做的是:如果发生错误,方案程序必须向用户发送消息(例如通过显示)而不暂停程序。
那可能吗?
通常你会使用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
.
文件:
由于您想捕获所有错误,例如两者都引发的错误,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)方案。