racketunit检查不是抛出异常

Gau*_*ain 1 testing racket

(check < 4 3)在屏幕上返回错误消息,但该函数也返回#<void>.我期待它只返回一个例外,而不是无效.我是否正确理解以下球拍文档:

"如果条件成立,则检查评估为(void).如果条件不成立,则检查会引发exn:test的实例:检查详细说明失败的信息."

> (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>
>
Run Code Online (Sandbox Code Playgroud)

Asu*_*awa 6

我认为你的解释是有道理的,并且文档是以误导的方式编写的,尽管在技术上可能不正确.

看看实现,我认为检查总是要返回#<void>(参见本行).

但是,当检查失败时,实际上会引发异常.只是默认情况下,它总是被捕获并转换为错误打印输出.这意味着异常通常不会被捕获,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]
Run Code Online (Sandbox Code Playgroud)

raise处理程序中的调用进一步传播异常,它被REPL捕获.如果您只想自定义异常的处理方式,您也可以参数化current-check-handler.


我推出了一个修复机架单元的文档,所以在未来的Racket版本中,文档应该更清楚这个问题.