typestar

panic and recover in Go

Panic is for the impossible; recover turns it back into an error at a boundary.

func safeDivide(a, b int) (result int, err error) {
    defer func() {
        if recovered := recover(); recovered != nil {
            err = fmt.Errorf("recovered: %v", recovered)
        }
    }()
    return a / b, nil // b == 0 panics
}

func outcomes() []string {
    var out []string
    for _, pair := range [][2]int{{6, 3}, {1, 0}} {
        value, err := safeDivide(pair[0], pair[1])
        out = append(out, fmt.Sprintf("%d %v", value, err))
    }
    return out
}

How it works

  1. recover only works inside a deferred function.
  2. Naming the result lets the deferred func set it.
  3. Recovering across a package boundary is the only polite use.

Keywords and builtins used here

The run, in numbers

Lines
17
Characters to type
403
Tokens
130
Three-star pace
105 tpm

At the three-star pace of 105 tokens a minute, this run takes about 74 seconds.

Type this snippet

Step 3 of 4 in defer, panic & recover, step 12 of 15 in Errors.

← Previous Next →