gpt4 book ai didi

testing - racketunit 检查没有抛出异常

转载 作者:行者123 更新时间:2023-11-28 20:18:21 27 4
gpt4 key购买 nike

(check < 4 3)在屏幕上返回一条错误消息,但函数也返回 #<void> .我期待它只返回一个异常而不是无效的。我理解以下内容吗 racket doc错误地:

“如果条件成立,则检查评估为(无效)。如果条件不成立,则检查引发 exn:test:check 的实例,其中包含详细说明失败的信息。”

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

最佳答案

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

看看实现,我认为检查总是返回 #<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 版本中,文档应该更清楚地说明这个问题。

关于testing - racketunit 检查没有抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com