Sök…


Anmärkningar

Den här artikeln antar kunskaper om grundläggande information om uppskjutningar

För vanlig felhantering, läs ämnet om felhantering

Panik

En panik stoppar det normala exekveringsflödet och lämnar den aktuella funktionen. Eventuella uppskjutna samtal kommer sedan att köras innan kontrollen överförs till nästa högre funktion på stacken. Varje stacks funktion kommer att lämna och köra uppskjutna samtal tills paniken hanteras med ett uppskjuten recover() , eller tills paniken når main() och avslutar programmet. Om detta inträffar kommer argumentet som ges för panik och ett stapelspår att skrivas ut till stderr .

package main

import "fmt"

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

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

Produktion:

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

Det är viktigt att notera att panic accepterar alla typer som sin parameter.

Ta igen sig

Återställning som namnet antyder kan försöka återhämta sig från panic . Återställningen måste försökas i ett uppskjutet uttalande eftersom normalt körningsflöde har stoppats. recover måste visas direkt i den uppskjutna funktionshöljet. Återställa uttalanden i funktioner som kallas av uppskjutna funktionssamtal kommer inte att respekteras. recover() -samtalet kommer att returnera argumentet som tillhandahålls till den första paniken, om programmet för närvarande är i panik. Om programmet för närvarande inte är i panik, kommer recover() att återgå 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")
}

Produktion:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow