Sam Lee
Sam Lee

Reputation: 10453

Does calling a function break recover()?

I was using a library which recover()s from panics, and it was using code that simplifies to the following:

func main() {
    defer rec()
    panic("X")
}

func rec() {
    rec2()
}

func rec2() {
    fmt.Printf("recovered: %v\n", recover())
}

The output of this is:

recovered: <nil>
panic: X
... more panic output ...

Notably, recover() returns nil instead of the error. Is this intended behavior?

Upvotes: 2

Views: 76

Answers (1)

Mr_Pink
Mr_Pink

Reputation: 109405

recover must be called directly by a deferred function.

from the language spec:

The return value of recover is nil if any of the following conditions holds:

  • panic's argument was nil;
  • the goroutine is not panicking;
  • recover was not called directly by a deferred function.

Upvotes: 3

Related Questions