go – defer func not recover-ThrowExceptions

Exception or error:

So, I’ve been fiddling around with go, and I found that function below recover successfully

package main

import (
    "fmt"
)

func a() {  
    defer func(){
        if r := recover(); r != nil {
            fmt.Println("Recovered", r)
        }
    }()
    n := []int{5, 7, 4}
    fmt.Println(n[3])
    fmt.Println("normally returned from a")
}

func main() {  
    a()
    fmt.Println("normally returned from main")
}

But this is not

package main

import (
    "fmt"
)

func r() {  
    if r := recover(); r != nil {
        fmt.Println("Recovered", r)
    }
}

func a() {  
    defer func(){
        r()
    }()
    n := []int{5, 7, 4}
    fmt.Println(n[3])
    fmt.Println("normally returned from a")
}

func main() {  
    a()
    fmt.Println("normally returned from main")
}

Can anybody explain why? I’ve been looking for answer but did not found anything that i can fully understand.
Thank you.

How to solve:

A call to recover will only stop a panic when called directly from the deferred function. Here’s the relevant text from the recover documentation:

Executing a call to recover inside a deferred function (but not any function called by it) stops the panicking sequence by restoring normal execution and retrieves the error value passed to the call of panic.

Leave a Reply

Your email address will not be published. Required fields are marked *