如何在clojure pre-expr中引发异常?

时间:2014-02-27 00:32:09

标签: clojure pre

clojure的pre-expr似乎很酷,但如果我想在:pre为假时提出异常,那么它是否可能?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Dire代替

(ns mytask
  (:require [dire.core :refer [with-precondition! with-handler!]]))

(defn add-one [n]
  (inc n))

(with-precondition! #'add-one
  "An optional docstring."
  ;;; Name of the precondition
  :not-two
  (fn [n & args]
    (not= n 2)))

(with-handler! #'add-one
  {:precondition :not-two}
  (fn [e & args] (apply str "Precondition failure for argument list: " (vector args))))

(add-one 2) ; => "Precondition failure for argument list: (2)"

答案 1 :(得分:1)

前提条件必须为true,否则抛出异常。如果您的条件是您希望在错误时抛出异常,则只需complement条件或not结果。

user=> (defn magic? [n] (= 0 (rem n 42)))
#'user/magic?

user=> (defn foo [n] {:pre [(magic? n)]} n)
#'user/foo
user=> (foo 42)
42

user=> (defn bar [n] {:pre [(not (magic? n))]} n)
#'user/bar

user=> (bar 42)
AssertionError Assert failed: (not (magic? n))  user/bar 

user=> (defn baz [n] {:pre [((complement magic?) n)]} n)
#'user/baz
user=> (baz 42)

AssertionError Assert failed: ((complement magic?) n)  user/baz