отложить функцию не восстановить - PullRequest
0 голосов
/ 18 октября 2019

Итак, я возился с go и обнаружил, что функция ниже восстанавливается успешно

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")
}

Но это не

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")
}

Кто-нибудь может объяснить, почему? Я искал ответ, но не нашел ничего, что мог бы полностью понять. Спасибо.

1 Ответ

1 голос
/ 18 октября 2019

Вызов для восстановления остановит панику только при вызове непосредственно из отложенной функции. Вот соответствующий текст из документации по восстановлению :

Выполнение вызова для восстановления внутри отложенной функции (но не любой вызываемой ею функции) останавливает последовательность паники, восстанавливая нормальное выполнениеи извлекает значение ошибки, переданное вызову паники.

...