cljs.repl/ex-str

functionsince v1.10.514Edit
(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.
Source code @ clojurescript:src/main/clojure/cljs/repl.cljc
(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)
                     "" ;; omit, not useful
                     (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)))))