On Sat, Mar 7, 2009 at 10:31 AM, Stuart Sierra
<[email protected]> wrote:
>
> On Mar 6, 5:14 pm, Mark Volkmann <[email protected]> wrote:
>> What's the recommended way to use this library in code that is run
>> outside a REPL to simplify stack traces so they focus on Clojure code
>> instead of Java code?
>
> Hi Mark,
>
> I wrote that library so I could use it in test-is, so I'm not sure if
> it will help you there. One thing it explicitly doesn't try to do is
> omit non-Clojure-related stack frames from the stack trace. It just
> rewrites Clojure-related frames so that they look more like Clojure
> code.
>
>> (try
>> (main)
>> (catch Exception e (print-stack-trace e 5)))
>
> In your example, you probably want "print-cause-trace" instead of
> "print-stack-trace". You probably also need a number much higher than
> 5 to get useful information.
>
> Someone else put a more elaborate stack trace library on github, you
> could search the list for it.
Thanks! Just using print-cause-trace is a major improvement. For example:
(use 'clojure.contrib.stacktrace)
(defn main [] (/ 5 0))
(main)
produces:
java.lang.ArithmeticException: Divide by zero (stacktrace.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:4533)
at clojure.lang.Compiler.load(Compiler.java:4846)
at clojure.lang.Compiler.loadFile(Compiler.java:4813)
at clojure.main$load_script__5681.invoke(main.clj:206)
at clojure.main$script_opt__5712.invoke(main.clj:258)
at clojure.main$main__5736$fn__5738.invoke(main.clj:333)
at clojure.main$main__5736.doInvoke(main.clj:328)
at clojure.lang.RestFn.invoke(RestFn.java:441)
at clojure.lang.Var.invoke(Var.java:354)
at clojure.lang.AFn.applyToHelper(AFn.java:179)
at clojure.lang.Var.applyTo(Var.java:463)
at clojure.main.main(main.java:39)
Caused by: java.lang.ArithmeticException: Divide by zero
at clojure.lang.Numbers.divide(Numbers.java:138)
at user$main__32.invoke(stacktrace.clj:4)
at user$eval__35.invoke(stacktrace.clj:7)
at clojure.lang.Compiler.eval(Compiler.java:4522)
... 11 more
Yuck! If I instead call main like this:
(try
(main)
(catch Exception e (print-cause-trace e 5)))
then the output is reduced to this, making the offending line easier to locate:
java.lang.ArithmeticException: Divide by zero
at clojure.lang.Numbers.divide (Numbers.java:138)
user/main (stacktrace.clj:4)
user/eval (stacktrace.clj:7)
clojure.lang.Compiler.eval (Compiler.java:4522)
clojure.lang.Compiler.load (Compiler.java:4846)
--
R. Mark Volkmann
Object Computing, Inc.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---