Go
Pánico y Recuperación
Buscar..
Observaciones
Este artículo supone el conocimiento de los conceptos básicos de aplazamiento.
Para el manejo de errores ordinarios, lea el tema sobre el manejo de errores.
Pánico
Un pánico detiene el flujo de ejecución normal y sale de la función actual. Cualquier llamada diferida se ejecutará antes de pasar el control a la siguiente función superior en la pila. La función de cada pila saldrá y ejecutará llamadas diferidas hasta que el pánico se maneje usando un recover()
diferido recover()
, o hasta que el pánico alcance main()
y finalice el programa. Si esto ocurre, el argumento proporcionado para entrar en pánico y un seguimiento de pila se imprimirá en stderr
.
package main
import "fmt"
func foo() {
defer fmt.Println("Exiting foo")
panic("bar")
}
func main() {
defer fmt.Println("Exiting main")
foo()
}
Salida:
Exiting foo
Exiting main
panic: bar
goroutine 1 [running]:
panic(0x128360, 0x1040a130)
/usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
/tmp/sandbox550159908/main.go:7 +0x160
main.main()
/tmp/sandbox550159908/main.go:12 +0x120
Es importante tener en cuenta que el panic
aceptará cualquier tipo como parámetro.
Recuperar
Recuperar como su nombre lo indica, puede intentar recuperarse de un panic
. La recuperación debe intentarse en una declaración diferida ya que el flujo de ejecución normal se ha detenido. La instrucción de recover
debe aparecer directamente dentro del encierro de la función diferida. No se aceptarán las declaraciones de recuperación en funciones llamadas por llamadas de función diferidas. La llamada recover()
devolverá el argumento provisto al pánico inicial, si el programa está actualmente en pánico. Si el programa no tiene pánico actualmente, recover()
devolverá nil
.
package main
import "fmt"
func foo() {
panic("bar")
}
func bar() {
defer func() {
if msg := recover(); msg != nil {
fmt.Printf("Recovered with message %s\n", msg)
}
}()
foo()
fmt.Println("Never gets executed")
}
func main() {
fmt.Println("Entering main")
bar()
fmt.Println("Exiting main the normal way")
}
Salida:
Entering main
Recovered with message bar
Exiting main the normal way