Uso de `recover`
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 43 de 68.
Mientras que panic detiene tu programa inmediatamente, Go proporciona una forma de recuperar el control a través de la función recover. La función recover te permite capturar un pánico y manejarlo de forma elegante, evitando que todo tu programa se bloquee.
Sin embargo, recover tiene un requisito muy específico: solo puede usarse dentro de una función diferida. Cuando ocurre un pánico, Go ejecuta todas las funciones diferidas antes de que el programa finalice, dándole a recover la oportunidad de interceptar el pánico:
func riskyFunction() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("something went wrong!")
}La función recover devuelve el valor que se pasó a panic, o nil si no ocurrió ningún pánico. Esto le permite comprobar si ocurrió un pánico y tomar las medidas adecuadas, como registrar el error o realizar operaciones de limpieza.
Al igual que panic, recover debe usarse con moderación en Go. Se ve con mayor frecuencia en escenarios como servidores web donde se desea evitar que el pánico de una sola solicitud bloquee todo el servidor, permitiéndole continuar atendiendo otras solicitudes.
Desafío
FácilConstruye un controlador de solicitudes de un servidor web que use recover para manejar las situaciones de pánico correctamente y evitar que todo el servidor se bloquee. Este desafío demuestra cómo usar recover dentro de una función diferida para capturar situaciones de pánico y mantener la estabilidad del servidor.
Recibirás dos entradas:
- Una cadena que contiene los detalles de la solicitud en el formato
"endpoint,method,action"(por ejemplo,"/api/users,GET,process") - Una cadena que contiene la configuración del servidor en el formato
"server_name,max_requests"(por ejemplo,"WebServer,100")
Tu tarea es:
- Analizar la primera entrada separándola por comas para obtener el endpoint, el método y la acción
- Analizar la segunda entrada separándola por comas para obtener el nombre del servidor y el número máximo de solicitudes
- Convertir la cadena del número máximo de solicitudes en un entero
- Crear una función llamada
handleRequestque reciba el endpoint, el método, la acción y el nombre del servidor como parámetros - Dentro de
handleRequest, añadir una función diferida que userecoverpara capturar cualquier situación de pánico:- Si se recupera una situación de pánico (recover devuelve un valor distinto de nil), imprimir:
"Server [server_name] recovered from panic: [panic_value]" - Después de manejar la situación de pánico, imprimir:
"Request handling completed safely"
- Si se recupera una situación de pánico (recover devuelve un valor distinto de nil), imprimir:
- Después de la función diferida, simular el procesamiento de la solicitud según la acción:
- Si la acción es
"process": imprimir"Processing [method] request to [endpoint]" - Si la acción es
"panic_nil": imprimir"Attempting dangerous operation"y después llamar apanic("nil pointer access") - Si la acción es
"panic_overflow": imprimir"Attempting resource allocation"y después llamar apanic("memory overflow") - Si la acción es
"panic_timeout": imprimir"Attempting database connection"y después llamar apanic("connection timeout") - Para cualquier otra acción: imprimir
"Unknown action: [action]"y después llamar apanic("invalid action")
- Si la acción es
- En la función principal, imprimir el mensaje de inicio del servidor:
"Starting [server_name] with max [max_requests] requests" - Llamar a la función
handleRequestcon los parámetros analizados - Después de llamar a la función, imprimir el estado del servidor:
"Server [server_name] is still running" - Finalmente, imprimir un resumen:
"Server Summary:""Name: [server_name]""Max Requests: [max_requests]""Last Request: [method] [endpoint]""Action Performed: [action]""Status: Operational"
Usa el paquete strings para separar las cadenas de entrada por comas y el paquete strconv para convertir la cadena del número máximo de solicitudes en un entero. Este desafío demuestra cómo recover permite que los servidores manejen correctamente situaciones de pánico inesperadas, evitando que los fallos de solicitudes individuales hagan caer todo el sistema.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Leer entrada
var requestDetails string
var serverConfig string
fmt.Scanln(&requestDetails)
fmt.Scanln(&serverConfig)
// Analizar detalles de la solicitud
requestParts := strings.Split(requestDetails, ",")
endpoint := requestParts[0]
method := requestParts[1]
action := requestParts[2]
// Analizar configuración del servidor
configParts := strings.Split(serverConfig, ",")
serverName := configParts[0]
maxRequests, _ := strconv.Atoi(configParts[1])
// TODO: Escribe tu código a continuación
// Crear la función handleRequest con mecanismo de recuperación (recover)
// Imprimir mensaje de inicio del servidor
// Llamar a la función handleRequest
// Imprimir el estado del servidor y el resumen
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea7Manejo de errores a fondo
Tipos de error personalizadosEnvolver errores con `%w`Desenvolver con `errors.Is`Desenvolver con `errors.As`Entendiendo `panic`Uso de `recover`Repaso - División segura2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientosPractica por tu cuenta: Compilador de Go online