Ricerca…


Osservazioni

Questo articolo presuppone la conoscenza di Defer Basics

Per la normale gestione degli errori, leggere l' argomento sulla gestione degli errori

Panico

Un panico blocca il normale flusso di esecuzione ed esce dalla funzione corrente. Qualsiasi chiamata differita verrà quindi eseguita prima che il controllo venga passato alla successiva funzione superiore nello stack. Ogni funzione dello stack verrà chiusa ed eseguirà le chiamate differite fino a quando il panico verrà gestito utilizzando un recover() differito recover() , o fino a quando il panico raggiunge main() e termina il programma. Se ciò si verifica, l'argomento fornito per il panico e una traccia dello stack verranno stampati su stderr .

package main

import "fmt"

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

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

Produzione:

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

È importante notare che il panic accetterà qualsiasi tipo come parametro.

Recuperare

Recuperare come suggerisce il nome, può tentare di riprendersi dal panic . Il recupero deve essere tentato in una dichiarazione posticipata poiché il normale flusso di esecuzione è stato interrotto. La dichiarazione di recover deve apparire direttamente all'interno del recinto della funzione posticipata. Recuperare le affermazioni in funzioni chiamate da chiamate con funzioni differite non sarà rispettato. La chiamata a recover() restituirà l'argomento fornito al panico iniziale, se il programma è attualmente in panico. Se il programma non è attualmente in panico, recover() restituirà 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")
}

Produzione:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow