Go: Recover from a panic

A panic is caused either by a runtime error or an explicit call to the built-in panic function.

A program recovers from a panic by calling the built-in function recover, after which normal execution is resumed. Since all the functions ordinary code is skipped during a panic, the only chance you have to call recover is from within a deferred function.

func foo() { defer bar() statement panic("Argh!") statement statement } func bar() { statement statement recover() statement statement } Return normally

The recover function returns whatever you gave as argument to the panic function. (During normal operation it will return nil.)

Another example

func main() {
        s := foo()
        fmt.Printf("main received: %q\n", s)
}

func foo() string {
        defer func() {
                if err := recover(); err != nil {
                        fmt.Printf("recovering from: %q\n", err)
                }
        }()
        s := "before"
        panic("disaster")
        s += " after"
        return s
}

Output:

recovering from: "disaster"
main received: ""

Since the panic occured before foo returned a value, s in main still has its initial zero value "":

Return a value

To return a value during a panic, use a named return value:

func main() {
        s := foo()
        fmt.Printf("main received: %q\n", s)
}

func foo() (s string) {
        defer func() {
                if err := recover(); err != nil {
                        fmt.Printf("recovering from: %q\n", err)
                        s += " during"
                }
        }()
        s = "before"
        panic("disaster")
        s += " after"
        return s
}

Output:

recovering from: "disaster"
main received: "before during"

Comments

Be the first to comment!