Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Construye 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:

  1. Analizar la primera entrada separándola por comas para obtener el endpoint, el método y la acción
  2. Analizar la segunda entrada separándola por comas para obtener el nombre del servidor y el número máximo de solicitudes
  3. Convertir la cadena del número máximo de solicitudes en un entero
  4. Crear una función llamada handleRequest que reciba el endpoint, el método, la acción y el nombre del servidor como parámetros
  5. Dentro de handleRequest, añadir una función diferida que use recover para 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"
  6. 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 a panic("nil pointer access")
    • Si la acción es "panic_overflow": imprimir "Attempting resource allocation" y después llamar a panic("memory overflow")
    • Si la acción es "panic_timeout": imprimir "Attempting database connection" y después llamar a panic("connection timeout")
    • Para cualquier otra acción: imprimir "Unknown action: [action]" y después llamar a panic("invalid action")
  7. En la función principal, imprimir el mensaje de inicio del servidor: "Starting [server_name] with max [max_requests] requests"
  8. Llamar a la función handleRequest con los parámetros analizados
  9. Después de llamar a la función, imprimir el estado del servidor: "Server [server_name] is still running"
  10. 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
	
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Go online