欢迎!请参阅关于页面获取更多关于此如何工作的信息。
函数有时可能会抛出期望的异常。例如,函数fn / 可能会抛出DivisionByZeroException。我该如何使用spec来捕获它?
/
简单的回答是“你不需要这样做”。Spec可以讨论数据的结构和函数的转换行为,但异常绕过了这种行为:异常意味着该函数没有可以指定的结果。
与你问题相关的方法是将你的异常转换为数据。
允许异常在代码中流动可能导致不必要的复杂。你可以将可能抛出异常的代码包裹在try/catch中,并将异常转换为数据。
一旦异常从函数回传成为数据,它就回到了spec的领域。
你可以在cognitect-labs/anomalies库中看到这种方法。
同样,ex-info允许你将数据附加到异常上。
Spec定义应该使异常成为不可能
(defn myfn [x y] (/ x y)) (s/fdef myfn :args (s/cat :x number? :y (s/and number? (complement zero?))))
当启用仪表(在开发/测试期间)时,如果你将0传递给myfn作为y参数,它将立即失败。请参阅:仪表化和测试。
0
myfn
y