Al igual que el bloque try/catch en excepción en lenguajes como Java , C# , etc., se usa para detectar excepciones de manera similar en el lenguaje Go, la función de recuperación se usa para manejar el pánico. Es una función incorporada que se define en el paquete incorporado del lenguaje Go. El uso principal de esta función es recuperar el control de un Goroutine en pánico. O, en otras palabras, maneja el comportamiento de pánico del Goroutine .
Sintaxis:
func recover() interface{}
Puntos importantes:
- La función de recuperación siempre se llama dentro de la función diferida, no en la función normal. Si llama a la función de recuperación dentro de la función normal o fuera de la función diferida, entonces la función de recuperación no detiene la secuencia de pánico como se muestra en el Ejemplo 1. Por lo tanto, siempre llame a la función de recuperación dentro de la función diferida porque la función diferida no detiene su ejecución si el programa entra en pánico, entonces la función de recuperación detiene la secuencia de pánico simplemente restaurando la ejecución normal de la gorutina y recupera el valor de error pasado a la llamada de pánico como se muestra en el Ejemplo 2.
- La función de recuperación solo funciona si llama a la misma rutina en la que se produce el pánico. Si lo llama en una rutina diferente, entonces no funcionará como se muestra en el Ejemplo 3.
- Si desea encontrar el seguimiento de la pila, utilice la función PrintStack que se define en el paquete de depuración.
Ejemplo 1:
// Go program which illustrates // the concept of recover package main import "fmt" // This function is created to handle // the panic occurs in entry function // but it does not handle the panic // occurred in the entry function // because it called in the normal // function func handlepanic() { if a := recover(); a != nil { fmt.Println("RECOVER", a) } } // Function func entry(lang *string, aname *string) { // Normal function handlepanic() // 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") } fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname) fmt.Printf("Return successfully from the entry function") } // Main function func main() { A_lang := "GO Language" entry(&A_lang, nil) fmt.Printf("Return successfully from the main function") }
Producción:
panic: Error: Author name cannot be nil goroutine 1 [running]: main.entry(0x41a788, 0x0) /tmp/sandbox777592252/prog.go:35 +0x180 main.main() /tmp/sandbox777592252/prog.go:46 +0x40
Ejemplo 2:
// Go program which illustrates // the concept of recover package main import ( "fmt" ) // This function handles the panic // occur in entry function // with the help of the recover function func handlepanic() { if a := recover(); a != nil { fmt.Println("RECOVER", a) } } // Function func entry(lang *string, aname *string) { // Deferred function defer handlepanic() // 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") } fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname) fmt.Printf("Return successfully from the entry function") } // Main function func main() { A_lang := "GO Language" entry(&A_lang, nil) fmt.Printf("Return successfully from the main function") }
Producción:
RECOVER Error: Author name cannot be nil Return successfully from the main function
Ejemplo 3:
// Go program which illustrates // recover in a goroutine package main import ( "fmt" "time" ) // For recovery func handlepanic() { if a := recover(); a != nil { fmt.Println("RECOVER", a) } } /* Here, this panic is not handled by the recover function because of the recover function is not called in the same goroutine in which the panic occurs */ // Function 1 func myfun1() { defer handlepanic() fmt.Println("Welcome to Function 1") go myfun2() time.Sleep(10 * time.Second) } // Function 2 func myfun2() { fmt.Println("Welcome to Function 2") panic("Panicked!!") } // Main function func main() { myfun1() fmt.Println("Return successfully from the main function") }
Producción:
Welcome to Function 1 Welcome to Function 2 panic: Panicked!! goroutine 6 [running]: main.myfun2() /tmp/sandbox157568972/prog.go:31 +0xa0 created by main.myfun1 /tmp/sandbox157568972/prog.go:24 +0xc0
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