• 08/09/2024 2:52 AM

Funciones Panic y Recover

porJesus Flores

Ago 21, 2021

El sistema de tipos incorporado de Go nos ayuda a detectar muchos errores en tiempo de compilación, sin embargo hay otros errores como por ejemplo matriz fuera de límites, acceso a puntero nulo, que requieren verificaciones en tiempo de ejecución. GO no tiene un mecanismo para el manejo de excepciones, como en otros lenguajes, el clásico try y catch.

La manera en que Go funciona, es que durante la ejecución detecta errores y entra en pánico(panic) , detiene toda la ejecución del programa, sin embargo todas las llamadas a funciones diferidas(defer) en esa rutina se ejecutan y finalmente el programa se bloquea con un mensaje de error.Es importante mencionar que este mensaje de registro usualmente tiene suficiente información para analizar la causa del problema sin necesidad de ejecutar el programa repetidamente.

El pánico (panic) es una función que detiene el flujo de control del programa. Cuando una función X entra en pánico, la ejecución de X se detiene y cualquier función diferida(defer) en X se ejecuta normalmente.
Los pánicos son sencillos de inicializar, basta con invocar directamente la función panic.

Es importante mencionar que los panics no solo pueden venir de errores en tiempo de ejecución. Es posible llamar a la función panic directamente; acepta cualquier valor como argumento. Podemos utilizarla cuando deseemos cortar una ejecución de manera abrupta o sea una situación “imposible”, por ejemplo un caso donde no tenga sentido continuar ejecutando el programa.

A continuación veamos un ejemplo donde si ingreso un valor diferente de 1 o 2 , intencionalmente ejecuto un panic y corto la ejecución, no sin antes agregarle información a nuestro panic.

package main

import "fmt"

func main() {
	var team int
	fmt.Println("Teclee 1 si es Marvel o Teclee 2 si es DC")
	fmt.Scanln(&team)
	/*  Usamos una sentencia switch */
	switch team {
	case 1:
		fmt.Printf("Soy team Maverl")
	case 2:
		fmt.Printf("Soy team DC")
	default:
		panic(fmt.Sprintf("Eligí la opción  %d", team))
	}

}

Vale la pena hablar un poco acerca de la función recover la cual es útil para recuperar el control de una gorutina en pánico, sin embargo recover solo es de utilidad dentro de funciones diferidas(defer). Durante una ejecución normal una llamada a recover devolverá cero y no tendrá ningún otro efecto, en cambio si la goroutine actual se encuentra entrando en pánico, una llamada a la función recover capturará el valor dado al pánico y reanudará la ejecución normal.

Cambiamos un poco nuestro primer ejemplo para agregar un recover y podemos notar que ahora en lugar de cortarse la ejecución, la ejecución continua y nos imprime el valor que se encuentra dentro del panic.

package main

import "fmt"

func main() {
	var team int
	fmt.Println("Teclee 1 si es Marvel o Teclee 2 si es DC")
	fmt.Scanln(&team)
	defer func() {
		action := recover()
		fmt.Println(action)
	}()
	/*  Usamos una sentencia switch */
	switch team {
	case 1:
		fmt.Printf("Soy team Maverl")
	case 2:
		fmt.Printf("Soy team DC")
	default:
		panic(fmt.Sprintf("Eligí la opción  %d", team))
	}

}

por Jesus Flores

Ingeniero de Software y Agile Coach

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *