Go makes it possible to recover from a panic, by using the recover built-in function. A recover can stop a panic from aborting the program and let it continue with execution instead.
An example of where this can be useful: a server wouldn’t want to crash if one of the client connections exhibits a critical error. Instead, the server would want to close that connection and continue serving other clients. In fact, this is what Go’s net/http does by default for HTTP servers.
package main
import "fmt"
// This function panics.
func mayPanic() {
panic("a problem")
}
// recover must be called within a deferred function.
// When the enclosing function panics
// the defer will activate and a recover call within it will catch the panic.
func main() {
// The return value of recover is the error raised in the call to panic.
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered. Error:\n", r)
}
}()
mayPanic()
// This code will not run, because mayPanic panics.
// The execution of main stops at the point of the panic
// and resumes in the deferred closure.
fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
a problem
Source | License