Volcar rastros de pila de Goroutine en Go

Jay Singh 23 agosto 2022
Volcar rastros de pila de Goroutine en Go

El enfoque idiomático para lidiar con circunstancias extrañas es usar errores en un programa Go. Los errores causan la mayoría de los casos inusuales que surgen en el software.

Sin embargo, en casos excepcionales, el software no podrá seguir ejecutándose debido a un estado anómalo. En esta situación, el pánico puede terminar el programa antes de tiempo.

Cuando una función encuentra un panic, la ejecución de la función se detendrá, cualquier función retrasada se ejecutará y el control volverá a la persona que llama a la función.

Este procedimiento continúa hasta que todas las funciones de la gorutina actual hayan regresado, momento en el que el programa imprime el mensaje panic, luego el seguimiento de la pila, antes de terminar.

Cuando construyamos un programa de ejemplo, esto se volverá más claro.

Use panic para volcar rastros de pila de Goroutine en Go

Este script simple imprimirá el nombre completo de una persona. La función fullName devuelve el nombre completo de una persona.

Este método busca valores nil en los punteros firstName y lastName. Si es nil, la función envía una señal panic con un mensaje.

Cuando finalice el programa, imprimirá este mensaje.

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?, 0xc000070f70?)
    /tmp/sandbox885911142/prog.go:12 +0x114
main.main()
    /tmp/sandbox885911142/prog.go:20 +0x35

Ahora, el siguiente ejemplo comete el error común de intentar acceder al elemento final del segmento utilizando su longitud proporcionada por el len incorporado.

Para demostrar por qué esto podría provocar panic, ejecute el siguiente código.

package main

import (
    "fmt"
)
func main() {
    names := []string{
        "Iron Man",
        "Thor",
    }
    fmt.Println("My favorite superhero is:", names[len(names)])
}

Producción :

panic: runtime error: index out of range [2] with length 2

goroutine 1 [running]:
main.main()
    /tmp/sandbox2746930010/prog.go:12 +0x1b