Testing 球拍检查未引发异常

Testing 球拍检查未引发异常,testing,racket,Testing,Racket,(检查(显示(检查(定义(我周围的检查声) (使用处理器([exn:测试:检查?(λ(e)(上升e))])) (砰)) ->(参数化([current check around my check around]) (检查(需要机架单元) ->(定义(我周围的检查声) (使用处理器([exn:测试:检查?(λ(e)(上升e))])) (砰)) ->(参数化([current check around my check around]) (检查

(检查<4 3)
在屏幕上返回错误消息,但该函数也返回
。我希望它只返回一个异常,而不是无效。我是否错误地理解了以下内容:

“如果条件保持不变,则检查的计算结果为(void)。如果条件不保持不变,则检查将引发exn:test:check的实例,其中包含详细说明失败的信息。”

>(显示(检查<4 3))
--------------------
失败
姓名:支票
位置:(|来自未保存编辑器的交互| 75 11 1868 13)
表达式:(检查<4 3)
参数:(#

我认为您的解释是有道理的,文档的编写方式有误导性,尽管从技术上讲可能并不错误

看一下实现,我认为检查意味着总是返回
(请参阅)

但是,当检查失败时,实际上会引发异常。只是默认情况下,它总是被捕获并转换为错误打印输出。这意味着异常通常不会在
检查之外捕获,因此它总是有效地返回

您可以通过参数化参数来调整此行为。以下是一个示例:

-> (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]
->(需要机架单元)
->(定义(我周围的检查声)
(使用处理器([exn:测试:检查?(λ(e)(上升e))]))
(砰))
->(参数化([current check around my check around])
(检查<4 3))
;检查失败[,bt用于上下文]
处理程序中的
raise
调用进一步传播异常,并被REPL捕获。如果您只想自定义异常的处理方式,也可以改为参数化



我对rackunit文档进行了修复,因此在未来的Rack版本中,这些文档应该更清楚地说明这个问题。

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

看一下实现,我认为检查意味着总是返回
(请参阅)

但是,当检查失败时,实际上会引发异常。只是默认情况下,它总是被捕获并转换为错误打印输出。这意味着异常通常不会在
检查之外捕获,因此它总是有效地返回

您可以通过参数化参数来调整此行为。以下是一个示例:

-> (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]
->(需要机架单元)
->(定义(我周围的检查声)
(使用处理器([exn:测试:检查?(λ(e)(上升e))]))
(砰))
->(参数化([current check around my check around])
(检查<4 3))
;检查失败[,bt用于上下文]
处理程序中的
raise
调用进一步传播异常,并被REPL捕获。如果您只想自定义异常的处理方式,也可以改为参数化



我对rackunit文档进行了修复,因此在未来的Rack版本中,文档应该更清楚地说明这个问题。

谢谢Asumu。非常感谢您的帮助。谢谢Asumu。非常感谢您的帮助。