Manejo de pánicos en rutinas de Go
Go proporciona las funciones integradas pánico() y recovery() para administrar errores inesperados y condiciones fatales en código en ejecución. Para manejar los pánicos en una rutina de ejecución, es esencial comprender el alcance de recovery().
Comprender el alcance de recovery()
recover() solo puede recuperarse de pánicos dentro de la misma rutina que generó el pánico. Si se produce un pánico en una rutina sin recuperación activa(), todo el programa fallará.
Ejemplo con manejo de errores incorrecto
El ejemplo de código proporcionado en la pregunta no puede manejar un pánico porque recovery() está definido en la rutina principal, mientras que el pánico se genera en la rutina handle(). Como resultado, recovery() no puede acceder al valor de pánico.
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here doneEjemplo con manejo correcto de errores
Para manejar los pánicos generados en una gorutina, coloque recovery() dentro de la propia gorutina.
func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here doneExplicación
En este ejemplo corregido, recovery() ahora está dentro de la rutina handle(), por lo que puede capturar el pánico que surge al eliminar la referencia al puntero nulo. Luego se recupera el pánico y se imprime el mensaje "Recuperado".
Comprender el alcance de recovery() es crucial para un manejo efectivo de errores en las rutinas Go. Coloque siempre recovery() dentro de la misma rutina donde podría ocurrir el pánico para manejar e informar con gracia cualquier condición inesperada.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3