CLJ-1817 looks interesting. We’ve been achieving similar behaviour via `or` 
statements in `:pre/:post`:

(defn somefn [x]
  {:pre [(or (map? x) (throw+ {:type ::bad-stuff :details ...}))]}
  ...)


This way we were also getting more useful exception types than 
AssertionErrors, but it did feel a bit hacky.


On Tuesday, March 29, 2016 at 10:40:41 PM UTC+1, Francis Avila wrote:
>
> A wonderful hack I read about somewhere is to just use the clojure.test/is 
> macro, which I now do all the time:
>
> (require '[clojure.test :refer [is]])
> => nil
> (defn get-key [m k]
>   {:pre [(is (map? m) "m is not a map!")]}
>   (m k))
> => #'user/get-key
> (get-key [] 0)
>
> FAIL in clojure.lang.PersistentList$EmptyList@1 
> (form-init8401797809408331100.clj:2)
> m is not a map!
> expected: (map? m)
>   actual: (not (map? []))
> AssertionError Assert failed: (is (map? m) "m is not a map!") 
>  user/get-key (form-init8401797809408331100.clj:1)
>
>
> This is great for repl use, but it does side-effect (the printed error) 
> and doesn't return anything structured. It's suited to development-time 
> human use rather than runtime or machine-use.
>
> I see the potential for a macro which rethrows the assertion errors as 
> something like ex-info exceptions (i.e. something with structured data.) 
> That would fill runtime or machine-uses better (or structured logging?), 
> but I'm not sure that fits with the spirit of pre/post conditions in the 
> first place. After all, these do raise Java AssertionErrors, which are not 
> meant to be recoverable.
>
> On Tuesday, March 29, 2016 at 4:19:12 PM UTC-5, Alex Miller wrote:
>>
>> (zombie thread back from the dead... :)
>>
>> I think enhancements on :pre/:post are interesting.
>>
>> http://dev.clojure.org/jira/browse/CLJ-1817 seems like a good place to 
>> work on this.
>>
>>
>> On Tuesday, March 29, 2016 at 4:02:25 PM UTC-5, Colin Taylor wrote:
>>>
>>> Would there be interest in a ticket in this? Seems simple enough if (as 
>>> above) putting the message under the :pre key is acceptable?
>>>
>>>
>>> On Thursday, July 14, 2011 at 3:25:16 AM UTC+12, frye wrote:
>>>>
>>>> I do think a simple String error message is all that the user of the 
>>>> function should provide. From there, An AssertionError can throw up 
>>>> something along the lines of what you said - Expected… , Found… , Message. 
>>>> That would give enough information for reporting at least in a test 
>>>> framework. To get more precise information, like you said, that 
>>>> AssertionError could also throw up class/file information, etc. that a 
>>>> debugger could use. I would guard against designing these things to 
>>>> accomodate a context outside of it's execution scope. In the ideal 
>>>> functional world, the input and output are wholly localized. Any 
>>>> Error/Exception thrown can be consumed or chained to give very precise 
>>>> failure reasoning.  
>>>>
>>>>
>>>> As for how that would fit into the entire exception chain, that's still 
>>>> being thought (see here 
>>>> <http://dev.clojure.org/display/design/Error+Handling>). There are 
>>>> already a few approaches, and I think this (see here 
>>>> <http://dev.clojure.org/display/design/Error+Handling+Comparisons>) is 
>>>> the context of how the core team is approaching this problem. 
>>>>
>>>>
>>>> Cheers 
>>>> Tim 
>>>>
>>>>
>>>> On Tue, Jul 12, 2011 at 6:01 AM, Shantanu Kumar <kumar.s...@gmail.com> 
>>>> wrote:
>>>>
>>>>> As I am the culprit of having introduced it with a naive example, I'd
>>>>> better admit it may not be very useful in practical scenarios across a
>>>>> wide variety of use cases. For example, when there is an assertion
>>>>> error with message "`m` should be a map" 14 levels down the stack, I'd
>>>>> really wish it said "`m` -- Expected: map, Found: vector [:foo :bar]"
>>>>> so that I can debug it quickly.
>>>>>
>>>>> Pre-conditions and Post-conditions are a valuable debugging aid, and
>>>>> to enable that we need very precise information. Unfortunately passing
>>>>> a string error message cannot encapsulate enough error context. A more
>>>>> complex example can be where the correctness of input must be
>>>>> determined collectively (in association with other args) -- in those
>>>>> cases one can only fall back on comparing input values and raise
>>>>> IllegalArgumentException accordingly.
>>>>>
>>>>> Regards,
>>>>> Shantanu
>>>>>
>>>>> On Jul 11, 10:40 pm, Timothy Washington <twash...@gmail.com> wrote:
>>>>> > 
>>>>>
>>>>
>>>>

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