racketunit检查不是抛出异常

时间:2015-10-24 23:06:02

标签: testing racket

(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>
>

1 个答案:

答案 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版本中,文档应该更清楚这个问题。