Szukaj…


Uwagi

Ten artykuł zakłada znajomość Podstaw Defer

Aby zapoznać się ze zwykłą obsługą błędów, przeczytaj temat dotyczący obsługi błędów

Panika

Panika zatrzymuje normalny przepływ wykonania i wychodzi z bieżącej funkcji. Wszelkie odroczone wywołania będą wówczas wykonywane, zanim kontrola zostanie przekazana do następnej wyższej funkcji na stosie. Funkcja każdego stosu kończy działanie i uruchamia odroczone wywołania, dopóki panika nie zostanie obsłużona za pomocą odroczonego odtwarzania recover() lub dopóki panika nie osiągnie main() i zakończy działanie programu. Jeśli tak się stanie, argument przekazany do paniki i ślad stosu zostaną wydrukowane na stderr .

package main

import "fmt"

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

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

Wynik:

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

Ważne jest, aby pamiętać, że panic zaakceptuje każdy typ jako swój parametr.

Wyzdrowieć

Odzyskiwanie, jak sama nazwa wskazuje, może próbować wyleczyć się z panic . Należy podjąć próbę odzyskania w odroczonej instrukcji, ponieważ normalny przepływ wykonania został zatrzymany. recover oświadczenie musi pojawić się bezpośrednio w obudowie odroczonego funkcji. Odzyskiwanie instrukcji w funkcjach wywoływanych przez odroczone wywołania funkcji nie będzie honorowane. Wywołanie recover() zwróci podany argument do początkowej paniki, jeśli program aktualnie panikuje. Jeśli program aktualnie nie panikuje, funkcja return recover() zwróci 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")
}

Wynik:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow