Go by Example: Recover

Go hace posible recuperarse de un panic, utilizando la función incorporada recover. Un recover puede detener un panic para evitar que aborte el programa y permitir que continúe con la ejecución en su lugar.

Un ejemplo de dónde esto puede ser útil: un servidor no querría colapsar si una de las conexiones de los clientes muestra un error crítico. En cambio, el servidor querría cerrar esa conexión y continuar atendiendo a otros clientes. De hecho, esto es lo que hace por defecto el net/http de Go para servidores HTTP.

package main
import "fmt"

Esta función provoca un panic.

func mayPanic() {
    panic("a problem")
}

recover debe ser llamado dentro de una función diferida. Cuando la función que lo encierra entra en panic, el defer se activará y una llamada a recover dentro de él capturará el panic.

func main() {

El valor de retorno de recover es el error generado en la llamada a panic.

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

Este código no se ejecutará, porque mayPanic provoca un panic. La ejecución de main se detiene en el punto del panic y se reanuda en el cierre diferido.

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

Siguiente ejemplo: String Functions.