Skip to content

proposal: add Try and Recover #138

@dsnet

Description

@dsnet

Error handling is tedious, and when writing tests we are prioritizing getting the test written quickly rather than necessarily making it the most robust piece of code we ever wrote.

I propose adding the following:

func (c *C) Recover()
func Try(error)
func Try1[A any](A, error) A
func Try2[A, B any](A, B, error) (A, B)
func Try3[A, B, C any](A, B, C, error) (A, B, C)
func Try4[A, B, C, D any](A, B, C, D, error) (A, B, C, D)

where the Try functions panic if err is non-nil. Otherwise, it peels off the error and returns the other arguments as is.
The TryN functions are defined such that N is the number of return arguments. Generics in Go do not have variadic parametric types, so we cannot express a generic function with a generic number of arguments. Try4 should be sufficient since no standard library function has more than 4 return arguments.

Example usage:

func Test(t *testing.T) {
    c := qt.New(t)
    defer c.Recover() // catch errors panicked by calls to `Try` below

    zr := qt.Try1(gzip.NewReader(...))
    b := qt.Try1(io.ReadAll(zr))
    ... = b
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions