see also
https://github.com/golang/go/issues/41908
https://github.com/golang/go/issues/37243
https://github.com/gooid/gonotes/blob/master/inline_style_error_handle.md
On Wednesday, December 2, 2020 at 8:57:13 PM UTC+1 Oliver Smith wrote:
> Do I understand correctly that "last return value is error" is purely
> convention and there is no formal error handling in current go?
>
> My instinct is to leverage the 'else' keyword along with the notion of a
> "stock error whose return list's last element is type error with value !=
> nil.
>
> func not_stock() (int, interface{})
> func stock() error
> func stock() (int, error, string, float, error, error, error)
> func not_stock() (error, error, error, int)
> func stock() (error, error)
>
> Any other type of error handling can still be handled as the user wishes,
> stock errors simply provide syntax to lean into, and that syntax would be:
>
> [ <assignment> ] <call expr> ast.ELSE <block statement>
>
> e.g.
>
> file, err := io.Open(file) else {
> return nil, err
> }
> fh.Close() else {
> panic("close call failed")
> }
>
> Equivalent to:
>
> file, err := io.Open(file)
> if err != nil {
> return nil, err
> }
> if err := fh.Close(); err != nil {
> panic("close call failed")
> }
>
> One of the current nuisances of error handling is that it can break the
> clean flow of variable assignments, forcing you to add separate
> declarations or scopes. Given a function
>
> func NewStruct() (s *Struct, sz int, err error)
>
> you typically have two very different lifespans for the return values
>
> s, sz, err := NewStruct()
> if err != nil { // last reference to err in function
>
> vs
>
> if s, sz, err := NewStruct(); err != nil {
> panic(err)
> } else {
> // to access s and sz
> }
>
> or
>
> var (
> s *Struct
> sz int
> err error // but literally only for one line
> )
> if s, sz, err = NewStruct(); err != nil {
> panic(err)
> }
>
> Using the else construct always allows the shorter form, which is at least
> consistent:
>
> // not a sub-clause so s, sz and err introduced in current scope level.
> s, sz, err := NewStruct() else {
> panic(err)
> }
>
> The fly in the ointment here is ... where does the error go if you don't
> mention it?
>
> fh.Close() else {
> panic(?what?)
> }
>
> the lazy option would be `_`
>
> fh.Close() else {
> fmt.Errorf("unexpected close failure: %s", _)
> err := _
> panic(err)
> }
>
> But I think we can avoid the path of perl, and simply require capture if
> you want the value surfaced.
>
> err := fh.Close() else {
> panic(err)
> }
>
>
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/db52e100-83e0-4fed-9d19-c6278d4a211fn%40googlegroups.com.