Try out (clojure.repl/pst e 1000), where e is the exception you have caught.
Andy On Mon, Jun 2, 2014 at 12:28 PM, Lee Spector <lspec...@hampshire.edu> wrote: > > In my single-threaded code, exceptions stop execution and print a stack > backtrace. This is less informative than I would like [1], but sometimes it > provides crucial clues. > > My multi-threaded code generally uses agents (just because that's the best > way I've found to get something that behaves like pmap but with better > multicore processor utilization [2]). By default, exceptions in agents are > silent, which is a default that I've always found to be perplexing. But if > I pass an :error-handler argument to agent (as in [2] below) then I can at > least see the exception... but execution doesn't halt and I don't get a > backtrace. That means that if I'm running in a multi-core mode (as I > usually am) then the first unfortunate thing is that I have to notice the > printed exception (because execution continues past it if I don't). But the > even more unfortunate thing is that I then get no backtrace. In order to > get a backtrace I have to re-run my whole system in single-threaded mode, > and then hope that I hit the same error (since my systems almost always > involve a lot of randomness). > > I figure it would be easy to put an exit in the :error-handler that would > quit the whole program, but I don't know how I could get the stack > backtrace for the triggering exception. > > Does anyone know how to get this? > > Thanks, > > -Lee > > > [1] Oh, how I long to see the values of locals up the stack in these > backtraces. I understand there are ways to get this but that they require > particular tool chains (emacs w/ritz?); my longing is for this kind of > functionality no matter how I launch my code, or at least when I launch it > via "lein run". The lack of this feature is the #1 thing I miss in Clojure > relative to Common Lisp. > > [2] Specifically, pmap won't keep all cores busy if a thread that starts > later finishes earlier than one that starts earlier. Here's the code that I > use instead of pmap, which assumes there's a boolean-valued var called > single-thread-mode: > (defn pmapall > "Like pmap but: 1) coll should be finite, 2) the returned sequence > will not be lazy, 3) calls to f may occur in any order, to maximize > multicore processor utilization, and 4) takes only one coll so far." > [f coll] > (if single-thread-mode > (doall (map f coll)) > (let [agents (map #(agent % :error-handler (fn [agnt except] (println > except))) coll)] > (dorun (map #(send % f) agents)) > (apply await agents) > (doall (map deref agents))))) > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.