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.