0

我有以下球拍代码。

#lang racket

(require rackunit racket/exn)

(define (string-last s)
  (let ((lng (string-length s)))
    (substring s (- lng 1) lng)))

(string-last "")
(check-equal? (string-last "1") "1")
(check-equal? (string-last "testing") "g")

使用空字符串调用 string last 按预期失败:

--------------------
. ERROR
name:       check-exn
location:   014.rkt:12:0

substring: contract violation
  expected: exact-nonnegative-integer?
  given: -1
  argument position: 2nd
  other arguments...:
   ""
   0
--------------------

如何使用RackUnit库检查错误?

我试过了

(check-exn exn:fail? (string-last ""))

和其他几个变体代替,exn:fail?但我没有找到合适的变体。

4

1 回答 1

2

check-exn需要一个没有参数的函数——一个 thunk——它可以调用应该引发异常的函数。所以正确的咒语是

(check-exn exn:fail? (thunk (string-last "")))

它必须传递一个 thunk,否则 Racket 的默认评估顺序将意味着在调用函数之前引发异常,因此它永远无法捕获它。

于 2020-11-02T11:06:40.697 回答