Go
Panico e Recupero
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