clj-stacktrace icon indicating copy to clipboard operation
clj-stacktrace copied to clipboard

Class becomes Symbol when going through `str` and `read-string`

Open terjedahl opened this issue 8 years ago • 0 comments

I would like to get the stacktrace from an nREPL session using clj-stacktrace's parse-exception. I would get it back as a String, which I could then apply read-string to and either use as I need, or pass on to pst-str.

However, when the parsed structure is converted to a String and then back again, the value for the top level :class goes from Class to Symbol, which then causes an exception.

This works: (try (/ 0) (catch Exception e (-> e parse-exception pst-str)))

This does not work: (try (/ 0) (catch Exception e (-> e parse-exception str read-string pst-str)))

It gives the exception:

ClassCastException clojure.lang.Symbol cannot be cast to java.lang.Class  clj-stacktrace.repl/pst-class-on (repl.clj:59)

I can of course apply this work-around (I convert the symbol to a class):

(try (/ 0) (catch Exception e (-> e parse-exception str read-string (update-in [:class] class) pst-str)))

Suggested fix - alternative 1: Remove the type-hint in line 58, and to a type-test and conversion or similar before building the pst-line in lin 59.

Suggested fix - alternative 2: Have parse-exception return a String-value for :class - in the same way as the :class value is a String in the stacktrace-elements.

I would prefer alternative 2, as it would be more consistent in general. On the downside, it might break something for other users, assuming the expect a Class, but now get a String.

Either way, would you like me to submit a pull-request for one of the fix-alternatives? If so, which one?

terjedahl avatar Apr 28 '17 14:04 terjedahl