我想在测试中使用constantly
为引发异常的场景建模。在读取代码而不执行代码时,将不断使用现成的主体进行评估。即我不能这样做:
(def x (constantly (throw (Exception. "X"))))
(x 1 2 3)
相反,throw
立即发生。
这有效:
(defn x [&] (throw (Exception. "X")))
但是constantly
如此方便和惯用,我想知道是否有内置的等效功能(也许使用宏)?
答案 0 :(得分:3)
一种选择
VARGRAPHIC
答案 1 :(得分:1)
恒定是一个功能,而不是像UIView *whiteView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.width)];
whiteView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:whiteView];
这样的宏,因此您需要使用fn
来实现一种操作。
恒定渴望评估其参数,这就是为什么它立即失败的原因。
答案 2 :(得分:0)
有几种方法可以延迟Clojure中的计算
最明显的是delay
:
(def x (delay (throw (ex-info "myException" {}))))
@x ;; exception is thrown
您还可以使用lambda(类似于在其他语言中必须执行的操作),或者使用惰性。
鉴于问题中的代码示例,看起来您正在寻找这样的东西:
(defn x [& args]
(throw (ex-info "myException" {:args args})))
(try
(x 1 2 3)
(catch Exception e
(println "Exception! data is " (ex-data e))))
请注意使用ex-info
和ex-data
可能对传递信息有用。