欢迎!请参阅 关于页面 以获取更多有关如何运作的信息。
函数有时可能会抛出期望的异常。例如,函数 `/` 可能会抛出 DivideByZeroException。我该如何使用 spec 来捕获这个异常?
简单答案是“您不能”。Spec 可以谈论数据的结构以及函数的转换行为,但异常绕过了这种行为:异常意味着函数没有结果可以指定。
与您的问题相关的方法是将您的异常转化为数据。
让异常穿过代码可能是一个不必要的复杂性。您可以将可能会抛出的代码包装在try/catch中,并将异常转换为数据。
一旦异常成为从函数返回的数据,它就回到了规格领域。
您可以在cognitect-labs/anomalies库中看到这种方法。
类似地,ex-info允许您将数据附加到异常。
规格定义应使异常无法发生
(defn myfn [x y] (/ x y)) (s/fdef myfn :args (s/cat :x number? :y (s/and number? (complement zero?))))
在启用仪表(在开发/测试期间),如果您将0作为y传递给myfn,它将快速失败。请参阅: 仪表和测试。
0
y
myfn