Reputation: 5959
I am testing panic/recover
in Golang. This simple program works as expected:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer printRecover()
panic("OMG!")
}
Output:
Recovered: OMG!
However, if I wrap the function printRecover()
in a bigger deferred function:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer func() {
printRecover()
}()
panic("OMG!")
}
It does not recover and let the panic go through:
Recovered: <nil>
panic: OMG!
goroutine 1 [running]:
main.main()
/tmp/sandbox898315096/main.go:15 +0x60
Can someone explain the difference?
Upvotes: 6
Views: 1989
Reputation: 1216
It is because recover
will be nil
if not directly called by deferred function
Here is excerpt from golang 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.
For more info check the full spec here
Upvotes: 13