Pánico en Golang

En lenguaje Go, panic es como una excepción, también surge en tiempo de ejecución. O, en otras palabras, pánico significa que surge una condición inesperada en su programa Go debido a la cual se termina la ejecución de su programa. A veces, el pánico ocurre en tiempo de ejecución cuando surge alguna situación específica, como accesos a arrays fuera de los límites, etc., como se muestra en el Ejemplo 1 o, a veces, el programador lo lanza deliberadamente para manejar el peor de los casos en el programa Go con la ayuda de panic() como se muestra en el Ejemplo 2.
La función panic es una función incorporada que se define en el paquete incorporado del lenguaje Go. Esta función termina el flujo de control y comienza a entrar en pánico.

Sintaxis:

func panic(v interface{})

Puede recibir cualquier tipo de argumento. Cuando ocurre el pánico en el programa Go, el programa finaliza en tiempo de ejecución y en la pantalla de salida se muestra un mensaje de error, así como el seguimiento de la pila hasta el punto donde ocurrió el pánico. Generalmente, en el lenguaje Go cuando ocurre el pánico en el programa, el programa no termina inmediatamente, termina cuando el go completa todo el trabajo pendiente de ese programa.
Por ejemplo, supongamos que una función A llama al pánico, luego se detiene la ejecución de la función A y si hay funciones diferidas disponibles en A, entonces se ejecutan normalmente después de eso, la función A regresa a su llamador y el llamador A se comporta como una llamada entrar en pánico Este proceso continúa hasta que se devuelven todas las funciones en la goroutine actual, después de eso, el programa falla como se muestra en el ejemplo 3.

Ejemplo 1:

// Simple Go program which illustrates
// the concept of panic
package main
  
import "fmt"
  
// Main function
func main() {
  
    // Creating an array of string type
    // Using var keyword
    var myarr [3]string
  
    // Elements are assigned
    // using an index
    myarr[0] = "GFG"
    myarr[1] = "GeeksforGeeks"
    myarr[2] = "Geek"
  
    // Accessing the elements
    // of the array
    // Using index value
    fmt.Println("Elements of Array:")
    fmt.Println("Element 1: ", myarr[0])
  
    // Program panics because
    // the size of the array is
    // 3 and we try to access
    // index 5 which is not 
    // available in the current array,
    // So, it gives an runtime error
    fmt.Println("Element 2: ", myarr[5])
  
}

Producción:

./prog.go:32:34: invalid array index 5 (out of bounds for 3-element array)

Ejemplo 2:

// Go program which illustrates 
// how to create your own panic
// Using panic function
package main
  
import "fmt"
  
// Function
func entry(lang *string, aname *string) {
  
    // When the value of lang 
    // is nil it will panic
    if lang == nil {
        panic("Error: Language cannot be nil")
    }
      
    // When the value of aname
    // is nil it will panic
    if aname == nil {
        panic("Error: Author name cannot be nil")
    }
  
    // When the values of the lang and aname 
    // are non-nil values it will print 
    // normal output
    fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname)
}
  
// Main function
func main() {
  
    A_lang := "GO Language"
  
    // Here in entry function, we pass 
    // a non-nil and nil values
    // Due to nil value this method panics
    entry(&A_lang, nil)
}

Producción:

panic: Error: Author name cannot be nil

goroutine 1 [running]:
main.entry(0x41a788, 0x0)
    /tmp/sandbox108627012/prog.go:20 +0x140
main.main()
    /tmp/sandbox108627012/prog.go:37 +0x40

Ejemplo 3:

// Go program which illustrates the
// concept of Defer while panicking
package main
  
import (
    "fmt"
)
  
// Function
func entry(lang *string, aname *string) {
  
    // Defer statement
    defer fmt.Println("Defer statement in the entry function")
  
    // When the value of lang
    // is nil it will panic
    if lang == nil {
        panic("Error: Language cannot be nil")
    }
      
    // When the value of aname
    // is nil it will panic
    if aname == nil {
        panic("Error: Author name cannot be nil")
    }
  
    // When the values of the lang and aname
    // are non-nil values it will 
    // print normal output
    fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname)
}
  
// Main function
func main() {
  
    A_lang := "GO Language"
  
    // Defer statement
    defer fmt.Println("Defer statement in the Main function")
  
    // Here in entry function, we pass
    // one non-nil and one-nil value
    // Due to nil value this method panics
    entry(&A_lang, nil)
}

Producción:

Defer statement in the entry function
Defer statement in the Main function
panic: Error: Author name cannot be nil

goroutine 1 [running]:
main.entry(0x41a780, 0x0)
    /tmp/sandbox121565297/prog.go:24 +0x220
main.main()
    /tmp/sandbox121565297/prog.go:44 +0xa0

Nota: La declaración o función diferida siempre se ejecuta incluso si el programa entra en pánico.

Uso de pánico:

  • Puede usar panic para un error irrecuperable en el que el programa no puede continuar con su ejecución.
  • También puede usar pánico si desea un error para una condición específica en su programa.

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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