(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.

Reply via email to