Atrapa los pánicos en Go
El pánico, como un error, ocurre durante el tiempo de ejecución. En otras palabras, el pánico ocurre cuando ocurre una circunstancia imprevista en su programa Go, lo que hace que la ejecución finalice.
Cuando se desarrolla una condición particular, como accesos a arreglos fuera de los límites, puede ocurrir un pánico durante el tiempo de ejecución. Estas acciones típicas son indexar una matriz más allá de su límite, realizar pruebas de tipo, ejecutar métodos en punteros nulos, emplear incorrectamente mutex e intentar interactuar con canales cerrados.
La mayoría de estos escenarios surgen de errores de programación que el compilador no puede descubrir mientras construye su software. Debido a que los pánicos proporcionan información importante para solucionar un problema, los desarrolladores suelen utilizarlos para indicar que han cometido errores durante el desarrollo.
Veamos algunos ejemplos para atrapar pánicos en Golang.
Atrapa los pánicos en Go
El siguiente programa imprimirá el nombre completo de una persona. La función fullName
genera el nombre completo de una persona.
Este método determina si los punteros firstName
y lastName
son nulos. Si es nil
, la función invoca pánico con un mensaje apropiado.
Ejemplo 1:
package main
import (
"fmt"
)
func fullName(firstName *string, lastName *string) {
if firstName == nil {
panic("runtime error: first name cannot be nil")
}
if lastName == nil {
panic("runtime error: last name cannot be nil")
}
fmt.Printf("%s %s\n", *firstName, *lastName)
fmt.Println("returned normally from fullName")
}
func main() {
firstName := "Jay"
fullName(&firstName, nil)
fmt.Println("returned normally from main")
}
Producción :
panic: runtime error: last name cannot be nil
goroutine 1 [running]:
main.fullName(0x405058?, 0xc0000a2f70?)
/tmp/sandbox3339134150/prog.go:12 +0x114
main.main()
/tmp/sandbox3339134150/prog.go:20 +0x35
El siguiente código muestra que la función empleado
se llama desde la función main
. Enviamos el nombre
y la edad
del empleado como entrada.
Cuando la edad de un empleado supera la edad de jubilación, la función de empleado entra en modo pánico.
Ejemplo 2:
package main
func employee(name *string, age int) {
if age > 65 {
panic("Age cannot be greater than retirement age")
}
}
func main() {
empName := "Jay"
age := 73
employee(&empName, age)
}
Producción :
panic: Age cannot be greater than retirement age
goroutine 1 [running]:
main.employee(...)
/tmp/sandbox4109873090/prog.go:5
main.main()
/tmp/sandbox4109873090/prog.go:12 +0x27
exit status 2
Recuperar Pánicos en Go
La función recuperar
utiliza el valor del error para determinar si ocurrió o no pánico. Debido a que la entrada de la función de pánico es una interfaz vacía, puede ser de cualquier tipo.
Cualquier tipo de interfaz, incluida la interfaz vacía, tiene un valor cero de nil
. Como se ve en este ejemplo, se debe tener cuidado para evitar el uso de nil
como entrada para pánico.
Ejemplo:
package main
import (
"fmt"
"log"
)
func main() {
divideByZero()
fmt.Println("Hey, we survived dividing by zero!")
}
func divideByZero() {
defer func() {
if err := recover(); err != nil {
log.Println("panic occurred:", err)
}
}()
fmt.Println(divide(1, 0))
}
func divide(a, b int) int {
if b == 0 {
panic(nil)
}
return a / b
}
Producción :
Hey, we survived dividing by zero!