On Mon, May 27, 2013 at 10:25 PM, Cedric Greevey <cgree...@gmail.com> wrote:
> What about add-watch? Can be used with any of Clojure's mutable-value > containers -- atoms, refs, agents, vars. If one is getting set to an > inappropriate value, or you suspect it is, you can attach a watcher to it > that will emit a log entry anytime it gets set to a value outside its > expected range, including printing a stack trace that should include the > spot in the code where this happened. > > In the case of immutable data or mutable Java objects getting scrozzled, > there's always the option of modifying the possible sites of the trouble to > log buggy behavior. For instance, if a LinkedBlockingQueue is getting > polluted with nils that are making the consumer blow up, adding before > (.offer lbq x) something like (if (nil? x) (throw (NullPointerException.))) > will move the blowup closer to the actual site of the error and give you an > informative stack trace. You might even leave that one in in production, if > the thing should (or *will*) die anyway if a nil gets in there, so your > user base's bug reports will already have a useful stack trace instead of a > useless one. > > Bad function arguments? Add a :pre clause to blow up immediately with a > useful stack trace, if one otherwise doesn't show up or shows up far from > the error. Bad values getting into immutable data? Add a (print ...) > wherever it's built up using assoc or conj or what-have-you. > > > You've just listed three things that I can *add* to my code to track down errors: watches, logging, pre clauses (and let's not forget the old standby printf). But that all misses the point. When my code goes *boom* and I get an error and a stacktrace, I want to know specifically what the context was at the time of *that particular crash*. If I have to alter my code and rerun, it may be hard to recreate the conditions that caused the error. If the stacktrace simply revealed richer information, such as what the inputs were to the various functions in the stacktrace, and I could explore the local variables, that would save tons of time spent trying to annotate the function to print or log the variables and then trying to get the bug to happen again. -- -- 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/groups/opt_out.