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()")
}
|