aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2008-07-26 14:39:19 +0000
committerscgilardi <scgilardi@gmail.com>2008-07-26 14:39:19 +0000
commitb1a0b7616ccfba7b2871f7fe4e05cf4300541fd0 (patch)
tree53261611c274d4635787f4ef0c364cd6832487ca
parent4193d4c5b9e8ae17497261017ebfa5487732d58c (diff)
updates for my remaining libs to the new namespace organization
-rw-r--r--except/except.clj44
1 files changed, 44 insertions, 0 deletions
diff --git a/except/except.clj b/except/except.clj
new file mode 100644
index 00000000..69e1732c
--- /dev/null
+++ b/except/except.clj
@@ -0,0 +1,44 @@
+;; Copyright (c) Stephen C. Gilardi. All rights reserved. The use and
+;; distribution terms for this software are covered by the Common Public
+;; License 1.0 (http://opensource.org/licenses/cpl.php) which can be found
+;; in the file CPL.TXT at the root of this distribution. By using this
+;; software in any fashion, you are agreeing to be bound by the terms of
+;; this license. You must not remove this notice, or any other, from this
+;; software.
+;;
+;; except.clj
+;;
+;; scgilardi (gmail)
+;; Created 07 July 2008
+
+(clojure/in-ns 'clojure-contrib.except)
+(clojure/refer 'clojure)
+
+(clojure-contrib.lib/use '(clojure-contrib string))
+
+(defn throw-if
+ "Throws an exception with a message if pred is true. Arguments are:
+
+ pred class? format format-args*
+
+ class is optional and defaults to Exception. If present, it must be a
+ Class in the tree under Throwable with a constructor that takes a single
+ String.
+
+ format is a string as documented for java.util.Formatter.
+
+ format-args are zero or more objects that correspond to the format
+ specifiers in format."
+ [pred & args]
+ (if pred
+ (let [class-present (instance? Class (first args))
+ args (if class-present args (cons Exception args))
+ [class fmt & fmt-args] args
+ ctor (.getConstructor (identity class) (into-array [String]))
+ message (apply format fmt fmt-args)
+ exception (.newInstance ctor (into-array [message]))
+ raw-trace (.getStackTrace exception)
+ boring? #(not= (.getMethodName %) "doInvoke")
+ trace (into-array (drop 2 (drop-while boring? raw-trace)))]
+ (.setStackTrace exception trace)
+ (throw exception))))