Обработка паники в рутине - PullRequest
0 голосов
/ 18 мая 2018

Я понимаю, что для восстановления паники используется.Но следующий блок не может быть восстановлен, когда возникает паника в процедуре go

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
     r := recover()
     if _, ok := r.(error); ok {
        fmt.Println("Recovered")
     }
    }()

    go handle(done)
    for {
        select{
        case <- done:
        return
        }
    } 
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}

Однако следующий блок может выполняться так, как ожидается,Вот ссылка на игровую площадку: https://play.golang.org/p/lkvKUxMHjhi

1 Ответ

0 голосов
/ 18 мая 2018

Восстановление работает только при вызове из той же программы, что и при вызове паники. Из блога golang:

Процесс продолжается вверх по стеку, пока не будут возвращены все функции в текущей программе, вв какой момент происходит сбой программы

Вам потребуется отсроченное восстановление в рамках программы.

https://blog.golang.org/defer-panic-and-recover

Документы / спецификации также включают в себя:

При выполнении функции F явный вызов паники или паники во время выполнения прекращает выполнение F. Затем любые функции, отложенные с помощью F, выполняются как обычно.Затем выполняются все отложенные функции, выполняемые вызывающей стороной F, и так далее, вплоть до любой отложенной функции верхнего уровня в , выполняющем процедуру .В этот момент программа завершается и сообщается об ошибке, включая значение аргумента для паники.Эта последовательность завершения называется паникой

https://golang.org/ref/spec#Handling_panics

...