Panic
La funzione panic
causa un'uscita immediata dal processo, con stampa dello stack trace su standard error.
(410panic.go):
package main
import "os"
func main() {
// La funzione panic termina immediatamente
// il programma con un messaggio d'errore
// e uno stack trace
// Il seguente codice causerebbe un panic
// panic("a problem")
// Si usa comunemente per abortire il programma
// in caso di errore non recuperabile
_, err := os.Create("/file")
if err != nil {
panic(err)
}
}
La funzione panic non appartiene ad un package, ma è una funzione primitiva del linguaggio Go stesso.
Recupero da panic
E' possibile uscire da un panic prima che venga eseguito.
Il panic prima di uscire esegue tutte le funzioni differite in ordine inverso dalla loro registrazione.
Una di queste può cancellare il panic con la funzione recover
.
(411-panic-recover.go):
package main
import "fmt"
func panicRecover() {
// defer: funzione eseguita all'uscita
// dalla funzione corrente
defer fmt.Println("Deferred call - 1")
defer func() {
fmt.Println("Deferred call - 2")
// E' possibile cancellare un panic
if e := recover(); e != nil {
// e è il valore passato a panic
fmt.Println("Recover with: ", e)
}
}()
panic("Just panicking")
// Tutti i defer vengono eseguiti, poi termina
// defer eseguite in ordine inverso dalla registrazione
fmt.Println("This will never be called")
}
func main() {
fmt.Println("Starting to panic")
panicRecover()
fmt.Println("Program regains control")
}
Notare che la funzione che invoca il panic non viene ripresa dopo il recover. Il controllo ritorna al main che l'ha invocata.