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.
Sfida
FacileCrea 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 è:
- Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere endpoint, method e action
- Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere il nome del server e il numero massimo di richieste
- Convertire la stringa del numero massimo di richieste in un intero
- Creare una funzione chiamata
handleRequestche accetti endpoint, method, action e il nome del server come parametri - All'interno di
handleRequest, aggiungere una funzione differita che usirecoverper 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"
- Se viene recuperata un'interruzione anomala (recover restituisce un valore non nil), stampare:
- 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 chiamarepanic("nil pointer access") - Se action è
"panic_overflow": stampare"Attempting resource allocation"e poi chiamarepanic("memory overflow") - Se action è
"panic_timeout": stampare"Attempting database connection"e poi chiamarepanic("connection timeout") - Per qualsiasi altra action: stampare
"Unknown action: [action]"e poi chiamarepanic("invalid action")
- Se action è
- Nella funzione main, stampare il messaggio di avvio del server:
"Starting [server_name] with max [max_requests] requests" - Chiamare la funzione
handleRequestcon i parametri analizzati - Dopo la chiamata alla funzione, stampare lo stato del server:
"Server [server_name] is still running" - 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
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività7Gestione degli errori in dettaglio
Tipi di errore personalizzatiAvvolgere gli errori con `%w`Rimuovere il wrapping con `errors.Is`Rimuovere il wrapping con `errors.As`Capire `panic`Usare `recover`Riepilogo - Divisione sicura2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online