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
recoveronly works inside a deferred function.- Naming the result lets the deferred func set it.
- Recovering across a package boundary is the only polite use.
Keywords and builtins used here
appenddefererrorforfuncifintrangerecoverreturnstringvar
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.
Step 3 of 4 in defer, panic & recover, step 12 of 15 in Errors.