On Sun, Oct 23, 2022 at 9:31 PM 'Daniel Lepage' via golang-nuts
<golang-nuts@googlegroups.com> wrote:

...


> 3. Streamlining shouldn't only apply to error handling that terminates the 
> function.
>
> Unlike panics, errors are values, and should be treated as such, which means 
> that the calling function should be able to decide what to do, and this 
> should include continuing. Frequently it won't - a lot of error handling is 
> just return fmt.Errorf("more context %w", err) - but any proposal that 
> assumes that it *always* won't is, IMO, confusing errors with panics. This is 
> the question that first started this thread - I didn't understand why all the 
> existing error proposals explicitly required that a function terminate when 
> it encounters an error, and AFAICT the answer is "because people are used to 
> thinking of errors more like panics than like return values".

For what it's worth, I see this differently.  The existing language is
not going to go away, and it's pretty good at handling the cases where
an error occurs and the function does not return.  Those cases are by
their nature all distinct.  They are not boilerplate.  The way we
write them today is fine: easy to read and not too hard to write.
When people writing Go complain about error handling, what they are
complaining about is the repetitive boilerplate, particularly "if err
!= nil { return nil, err }".  If we make any substantive changes to
the language or standard library for better error handling, that is
what we should address.  If we can address other cases, fine, but as
they already work OK they should not be the focus of any substantive
change.


> Is part of the problem that the discussion around the try/check/handle/etc. 
> proposals got so involved that nobody wants to even consider anything that 
> looks too similar to those? Would it be more palatable if I proposed it with 
> names that made it clearer that this is about the consolidation of error 
> handling rather than an attempt to replace it entirely?
>
> onErrors {
>     if must Foo(must Bar(), must Baz()) > 1 {
>       ...
>    }
> } on err {
>    ...
> }

While error handling is important, the non-error code path is more
important.  Somebody reading a function should be able to easily and
naturally focus on the non-error code.  That works moderately well
today, as the style is "if err != nil { ... }" where the "..." is
indented out of the normal flow.  It's fairly easy for the reader to
skip over the error handling code in order to focus on the non-error
code.  A syntactic construct such as you've written above buries the
lede: what you see first is the error path, but in many cases you
actually want to focus on the non-error path.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcXHaQk9TfuAz-TUFCsz_-0kDKa_14f3gYER2ufHbhM73Q%40mail.gmail.com.

Reply via email to