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