Menu
Coddy logo textTech

Usare `recover`

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 43 di 68.

Mentre panic arresta immediatamente il programma, Go offre un modo per riprendere il controllo tramite la funzione recover. La funzione recover ti permette di intercettare un panic e gestirlo in modo corretto, evitando che l’intero programma vada in crash.

Tuttavia, recover ha un requisito molto specifico: può essere usato solo all'interno di una funzione differita. Quando si verifica un panic, Go esegue tutte le funzioni differite prima che il programma termini, dando a recover la possibilità di intercettare il panic:

func riskyFunction() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    
    panic("something went wrong!")
}

La funzione recover restituisce il valore passato a panic, oppure nil se non si è verificato alcun panic. Questo ti permette di verificare se si è verificato un panic e di agire di conseguenza, ad esempio registrando l'errore o eseguendo operazioni di pulizia.

Come panic, recover dovrebbe essere usato con parsimonia in Go. Si incontra più comunemente in scenari come i server web, in cui vuoi impedire che il panic di una singola richiesta mandi in crash l’intero server, permettendogli di continuare a gestire altre richieste.

challenge icon

Sfida

Facile

Crea un gestore di richieste per un server web che usi recover per gestire le interruzioni anomale e impedire che l'intero server si arresti. Questa sfida mostra come usare recover all'interno di una funzione differita per intercettare le interruzioni anomale e mantenere stabile il server.

Riceverai due input:

  • Una stringa contenente i dettagli della richiesta nel formato "endpoint,method,action" (ad es., "/api/users,GET,process")
  • Una stringa contenente la configurazione del server nel formato "server_name,max_requests" (ad es., "WebServer,100")

Il tuo compito è:

  1. Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere endpoint, method e action
  2. Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere il nome del server e il numero massimo di richieste
  3. Convertire la stringa del numero massimo di richieste in un intero
  4. Creare una funzione chiamata handleRequest che accetti endpoint, method, action e il nome del server come parametri
  5. All'interno di handleRequest, aggiungere una funzione differita che usi recover per intercettare eventuali interruzioni anomale:
    • Se viene recuperata un'interruzione anomala (recover restituisce un valore non nil), stampare: "Server [server_name] recovered from panic: [panic_value]"
    • Dopo aver gestito l'interruzione anomala, stampare: "Request handling completed safely"
  6. Dopo la funzione differita, simulare l'elaborazione della richiesta in base all'action:
    • Se action è "process": stampare "Processing [method] request to [endpoint]"
    • Se action è "panic_nil": stampare "Attempting dangerous operation" e poi chiamare panic("nil pointer access")
    • Se action è "panic_overflow": stampare "Attempting resource allocation" e poi chiamare panic("memory overflow")
    • Se action è "panic_timeout": stampare "Attempting database connection" e poi chiamare panic("connection timeout")
    • Per qualsiasi altra action: stampare "Unknown action: [action]" e poi chiamare panic("invalid action")
  7. Nella funzione main, stampare il messaggio di avvio del server: "Starting [server_name] with max [max_requests] requests"
  8. Chiamare la funzione handleRequest con i parametri analizzati
  9. Dopo la chiamata alla funzione, stampare lo stato del server: "Server [server_name] is still running"
  10. Infine, stampare un riepilogo:
    • "Server Summary:"
    • "Name: [server_name]"
    • "Max Requests: [max_requests]"
    • "Last Request: [method] [endpoint]"
    • "Action Performed: [action]"
    • "Status: Operational"

Usa il pacchetto strings per dividere le stringhe di input in corrispondenza delle virgole e il pacchetto strconv per convertire la stringa del numero massimo di richieste in un intero. Questa sfida mostra come recover consenta ai server di gestire con eleganza le interruzioni anomale impreviste, impedendo che i singoli errori nelle richieste causino l'arresto dell'intero sistema.

Provalo tu

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Leggi l'input
	var requestDetails string
	var serverConfig string
	fmt.Scanln(&requestDetails)
	fmt.Scanln(&serverConfig)
	
	// Analizza i dettagli della richiesta
	requestParts := strings.Split(requestDetails, ",")
	endpoint := requestParts[0]
	method := requestParts[1]
	action := requestParts[2]
	
	// Analizza la configurazione del server
	configParts := strings.Split(serverConfig, ",")
	serverName := configParts[0]
	maxRequests, _ := strconv.Atoi(configParts[1])
	
	// TODO: Scrivi il tuo codice qui sotto
	// Crea la funzione handleRequest con il meccanismo recover
	// Stampa il messaggio di avvio del server
	// Chiama la funzione handleRequest
	// Stampa lo stato e il riepilogo del server
	
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online