Atrapa los pánicos en Go

Jay Singh 20 junio 2023
  1. Atrapa los pánicos en Go
  2. Recuperar Pánicos en Go
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!