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)))))

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to