Recover

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