(fn [agnt except] (println except)) -Lee
On Jun 2, 2014, at 3:38 PM, Sean Corfield <s...@corfield.org> wrote: > The exception object should have a full stack trace in it - how are you > printing your exceptions? > > Sean > > On 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))))) > -- Lee Spector, Professor of Computer Science Cognitive Science, Hampshire College 893 West Street, Amherst, MA 01002-3359 lspec...@hampshire.edu, http://hampshire.edu/lspector/ Phone: 413-559-5352, Fax: 413-559-5438 -- 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.