(check < 4 3)
在屏幕上返回错误消息,但该函数也返回#<void>
。我期待它只返回一个例外,而不是无效。我是否错误地理解了以下racket doc:
&#34;如果条件成立,则检查评估为(void)。如果条件不成立,则检查会引发一个exn:test的实例:检查详细说明失败的信息。&#34;
> (display (check < 4 3))
--------------------
FAILURE
name: check
location: (|interactions from an unsaved editor| 75 11 1868 13)
expression: (check < 4 3)
params: (#<procedure:<> 4 3)
. . Check failure
--------------------
#<void>
>
答案 0 :(得分:6)
我认为你的解释是有道理的,并且文档是以误导的方式编写的,尽管在技术上可能不正确。
看一下实现,我认为检查总是要返回#<void>
(参见this line)。
但是,当检查失败时,实际上会引发异常。它只是默认情况下总是被捕获并转换为错误打印输出。这意味着异常通常不会在check
之外被捕获,因此它实际上总是返回#<void>
。
您可以通过参数化current-check-around
参数来调整此行为。这是一个例子:
-> (require rackunit)
-> (define (my-check-around thunk)
(with-handlers ([exn:test:check? (λ (e) (raise e))])
(thunk)))
-> (parameterize ([current-check-around my-check-around])
(check < 4 3))
; Check failure [,bt for context]
处理程序中的raise
调用进一步传播异常,并且它被REPL捕获。如果您只想自定义处理异常的方式,您也可以参数化current-check-handler
。
我将修复程序推送到rackunit文档,所以在未来的Racket版本中,文档应该更清楚这个问题。