It's arguable. Exceptions give you a somewhat clean way of pattern match their 
type and dealing with failures in a single place in an uniform way. Ex having 
to deal with not ok http status codes and then a potential low level networking 
exception at the same level is good imho. 

I tend to use ex-info a lot lately, if you throw in some helpers it becomes 
quite clean/powerful. I wrote a little library that adds a clojure hierarchy on 
top of it and you then have a decent way of doing exception 'inheritance' via 
ex-info/ex-data.

https://github.com/mpenet/ex



On Friday, October 26, 2018 at 11:48:27 PM UTC+2, Sean Corfield wrote:
> For any library – for any function – there are always two classes of unhappy 
> path:
> 
>  
> 
> Expected, known failure modes.Unexpected, exceptional failure modes.
> 
>  
> 
> The former should not use exceptions. The library/function should signal the 
> error in a documented way through its return value. Calling code should check 
> the return value to see if the library/function failed in one of the 
> expected, known,
>  documented ways it is known to be possible to fail in, and respond 
> accordingly.
> 
>  
> 
> The latter can (and should) use exceptions. An exception says “I got into a 
> state I can’t handle because I wasn’t expecting to get there!” and maybe the 
> caller can handle that and maybe it can’t. Library/function authors can help 
> callers
>  here by:
> 
>  
> 
> Providing a clear but succinct message for the exception,And providing as 
> much potentially useful detail in the ex-data as possible.
> 
>  
> 
> Does Java (and its standard library) overuse exceptions? Yes, absolutely. It 
> throws exceptions for all sorts of completely predictable failure modes. We 
> don’t need (or want) to be Java.
> 
>  
> 
> Clojure provides perfectly good features to support both the expected and the 
> unexpected failure modes and, in particular, provides an excellent way to 
> convey information about the point of failure even when our code doesn’t know 
> how to
>  recover.
> 
>  
> 
> As Alex says, there may be value in providing a spec in your library for the 
> sort of ex-data you provide around exceptions. You’ll already be in “regular 
> Clojure land” as far as functions that return values that may indicate 
> success or
>  expected, known failure modes.
> 
>  
> 
> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
> 
> An Architect's View -- http://corfield.org/
> 
> 
> 
> "If you're not annoying somebody, you're not really alive."
> 
> -- Margaret Atwood
> 
>  
> 
> 
> 
> From: clo...@googlegroups.com <clo...@googlegroups.com> on behalf of Oleksii 
> Kachaiev <kach...@gmail.com>
> 
> Sent: Friday, October 26, 2018 2:28:35 PM
> 
> To: Clojure
> 
> Subject: Re: An Error spec?
> 
>  
> 
> 
> 
> 
> I've got the idea that you're not going to including anything like this into 
> core library. I just want to clarify because I'm actually a bit confused 
> here, and I think I'm not the only one. We promote doing functional 
> programming, staying declarative
>  when possible, using data with small pure testable functions as much as we 
> can... and at the same time declaring the "official" way of handling errors 
> using exceptions, which are side-effects by their nature, even tho' they play 
> really poorly with:
> 
> 
> 
> 
> 
> * laziness (which is a default behavior for most operations with most 
> collections in the language)
> 
> 
> 
> 
> 
> * multi-threaded code (especially in case of "opaque" jumps between 
> threads/executors when using core language concurrency primitives, or even 
> trying to emulate async event loop, i.e. with core.async)
> 
> 
> 
> 
> 
> * macros (often macroexpand screws up the only feature we love about 
> exceptions: traces, making them pretty much useless) 
> 
> 
> 
> 
> 
> I thought that the design approach of using data and staying declarative 
> should also be applied to errors handling. And a contract declared for a 
> function should reflect not only "the happy path" but all potential cases. We 
> see a lot of languages put some
>  mechanics into the core library or language design (i.e. Scala, Rust, 
> Haskell, Go etc) because errors and errors handling is a very significant 
> part of our programs that we just cannot ignore. You can like or dislike 
> them, you can always come up with something
>  very specific for your application or library. But the key idea here is that 
> core functionality is a rule of thumb for libraries & ecosystem in general. 
> So, when I do pick up library I can assume by default the way errors are 
> handled. Most probably my code
>  and libraries that I'm already using would play nicely with each other. 
> Which is not the case in Clojure. As a creator of a few Clojure libraries, I 
> always have to design upfront what my library will do with errors, either 
> with my own implementation or embracing/adopting
>  one of the existing libraries to handle control flows. And each time I'm 
> struggling with the choice because I know perfectly well that a) most other 
> libraries in the ecosystem would not be aligned with it automatically, b) 
> most applications/users will be forced
>  to learn how to deal with the control flow in this specific case. More 
> libraries you use = more cases of how errors are handled here and there = 
> more time you need to teach them to talk to each other. It seems to me that 
> the "write about your exceptions in
>  the documentation and pray all users of your code will read that carefully 
> and think through really hard" approach (which is the state of the art right 
> now) makes ecosystem of the language & libraries more fragile and more 
> fragmented than it might be.
> 
> 
> 
> 
> 
> Thanks,
> 
> 
> 
> On Friday, October 26, 2018 at 10:42:13 PM UTC+3, Sean Corfield wrote:
> 
> 
> 
> 
> 
> 
> 
> 
> I would likely only spec the status 200 OK responses. We use 400-series 
> status values when we send back an error. You might consider that to be the 
> “exception” of the HTTP world
> 😊 
> 
>  
> 
> We actually do have a documented format for 400-series responses but pretty 
> much any part can be omitted so callers might occasionally not be able to 
> ascertain a reason beyond “it failed”…
> 
>  
> 
> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
> 
> An Architect's View -- 
> http://corfield.org/
> 
> 
> 
> "If you're not annoying somebody, you're not really alive."
> 
> -- Margaret Atwood
> 
>  
> 
> 
> 
> From:
> 
> clo...@googlegroups.com <clo...@googlegroups.com> on behalf of
>  Didier <did...@gmail.com>
> 
> Sent: Friday, October 26, 2018 11:35:20 AM
> 
> To: Clojure
> 
> Subject: RE: An Error spec?
> 
>  
> 
> 
> 
> 
> Sean, if you were to Spec your API responses, what would you do for your 
> error response?
> 
> 
> 
> This is my issue. I operate in a distributed environment. If I produce a set 
> of data, but one field failed to compute properly, maybe a downstream system 
> was down, maybe some information I was given to compute was corrupted, or 
> missing, etc. And say this producing
>  service has no user facing component, failing it is not logical. So I need 
> to publish the partial result, and the error field should indicate an error. 
> In my case it publishes a document entry in a nosql datastore, and events 
> about it.
> 
> 
> 
> Now, some other system will eventually consume that document, to display it 
> to the user. When it does, it must appropriately handle the fact that some 
> fields were in error.
> 
> 
> 
> My documents are fully specced. So that consuming services can easily know 
> their shapes and structure, so they can be sure to support them fully.
> 
> 
> 
> In such scenario, exceptions aren't useful, but only because Java exceptions 
> are crap at serialization. So I need to do the same thing you are, marshal my 
> exception into an error and serialize that into my document. Then I spec the 
> field appropriately.
> 
> 
> 
> 
> Now, I feel a lot of people using Spec would have such a use case, as its a 
> logical tool to model data at your boundaries, and so I felt it might make 
> sense to offer a spec macro for it.
> 
> 
> 
> -- 
> 
> You received this message because you are subscribed to the Google
> 
> Groups "Clojure" group.
> 
> To post to this group, send email to 
> clo...@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+u...@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+u...@googlegroups.com.
> 
> For more options, visit 
> https://groups.google.com/d/optout.
> 
> 
> 
> 
> 
> 
> 
> 
> -- 
> 
> You received this message because you are subscribed to the Google
> 
> Groups "Clojure" group.
> 
> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com.
> 
> For more options, visit https://groups.google.com/d/optout.

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