Поиск…


замечания

Эта статья предполагает знание основ Defer

Для обычной обработки ошибок прочитайте раздел об обработке ошибок

паника

Паника останавливает нормальный поток выполнения и выходит из текущей функции. Любые отложенные вызовы будут выполняться до того, как управление будет передано следующей более высокой функции в стеке. Функция каждого стека будет выходить и запускать отложенные вызовы до тех пор, пока паника не будет обработана с использованием отложенного recover() , или пока паника не достигнет main() и не завершит программу. Если это произойдет, аргумент, предоставленный панике, и трассировка стека будут напечатаны на stderr .

package main

import "fmt"

func foo() {
    defer fmt.Println("Exiting foo")
    panic("bar")
}

func main() {
    defer fmt.Println("Exiting main")
    foo()
}

Выход:

Exiting foo
Exiting main
panic: bar


goroutine 1 [running]:
panic(0x128360, 0x1040a130)
    /usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
    /tmp/sandbox550159908/main.go:7 +0x160
main.main()
    /tmp/sandbox550159908/main.go:12 +0x120

Важно отметить, что panic будет принимать любой тип в качестве параметра.

оправляться

Восстановление, как следует из названия, может попытаться восстановиться после panic . Восстановление должно быть предпринято в отложенном заявлении, поскольку нормальный поток выполнения был остановлен. Оператор recover должен отображаться непосредственно в оболочке отложенной функции. Восстановление заявлений в функциях, вызванных отложенными вызовами функций, не будет выполнено. Вызов recover() возвращает аргумент, предоставленный для начальной паники, если программа в настоящее время впадает в панику. Если программа в настоящее время не паникует, recover() вернет nil .

package main

import "fmt"

func foo() {
    panic("bar")
}

func bar() {
    defer func() {
        if msg := recover(); msg != nil {
            fmt.Printf("Recovered with message %s\n", msg)
        }
    }()
    foo()
    fmt.Println("Never gets executed")
}

func main() {
    fmt.Println("Entering main")
    bar()
    fmt.Println("Exiting main the normal way")
}

Выход:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow