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