cljs.repl/ex-str
function | since v1.10.514 | Edit |
(ex-str {:keys [:clojure.error/phase :clojure.error/source :clojure.error/line :clojure.error/column :clojure.error/symbol :clojure.error/class :clojure.error/cause :clojure.error/spec], :as triage-data})
Source docstring:
Returns a string from exception data, as produced by ex-triage.
The first line summarizes the exception phase and location.
The subsequent lines describe the cause.
(defn ex-str
[{:keys [:clojure.error/phase :clojure.error/source :clojure.error/line :clojure.error/column
:clojure.error/symbol :clojure.error/class :clojure.error/cause :clojure.error/spec]
:as triage-data}]
(let [spec-loaded? (some? (resolve 'clojure.spec.alpha/explain-out))
loc (str (or source "REPL") ":" (or line 1) (if column (str ":" column) ""))
class-name (name (or class ""))
simple-class (if class (or (first (re-find #"([^.])++$" class-name)) class-name))
cause-type (if (contains? #{"Exception" "RuntimeException"} simple-class)
"" (str " (" simple-class ")"))]
(case phase
:read-source
(format "Syntax error reading source at (%s).%n%s%n" loc cause)
:macro-syntax-check
(format "Syntax error macroexpanding %sat (%s).%n%s"
(if symbol (str symbol " ") "")
loc
(if (and spec spec-loaded?)
(with-out-str
((resolve 'clojure.spec.alpha/explain-out)
(if (= @(resolve 'clojure.spec.alpha/*explain-out*) @(resolve 'clojure.spec.alpha/explain-printer))
(update spec :clojure.spec.alpha/problems
(fn [probs] (map #(dissoc % :in) probs)))
spec)))
(format "%s%n" cause)))
:macroexpansion
(format "Unexpected error%s macroexpanding %sat (%s).%n%s%n"
cause-type
(if symbol (str symbol " ") "")
loc
cause)
:compile-syntax-check
(format "Syntax error%s compiling %sat (%s).%n%s%n"
cause-type
(if symbol (str symbol " ") "")
loc
cause)
:compilation
(format "Unexpected error%s compiling %sat (%s).%n%s%n"
cause-type
(if symbol (str symbol " ") "")
loc
cause)
:read-eval-result
(format "Error reading eval result%s at %s (%s).%n%s%n" cause-type symbol loc cause)
:print-eval-result
(format "Error printing return value%s at %s (%s).%n%s%n" cause-type symbol loc cause)
:execution
(if (and spec spec-loaded?)
(format "Execution error - invalid arguments to %s at (%s).%n%s"
symbol
loc
(with-out-str
((resolve 'clojure.spec.alpha/explain-out)
(if (= @(resolve 'clojure.spec.alpha/*explain-out*) @(resolve 'clojure.spec.alpha/explain-printer))
(update spec :clojure.spec.alpha/problems
(fn [probs] (map #(dissoc % :in) probs)))
spec))))
(format "Execution error%s at %s(%s).%n%s%n"
cause-type
(if symbol (str symbol " ") "")
loc
cause)))))