Il gestore catch-all
Fa parte della sezione Logica e flusso del percorso C++ di Coddy. Lezione 52 di 56.
A volte il tuo programma potrebbe incontrare errori imprevisti che non rientrano nei tipi specifici di eccezione per cui ti sei preparato. Il gestore universale catch(...) fornisce una rete di sicurezza che intercetta qualsiasi eccezione non gestita dai blocchi catch più specifici.
Il gestore generico usa tre punti (...) invece di specificare un tipo di eccezione particolare. Deve essere posizionato dopo tutti gli altri blocchi catch, poiché C++ li controlla nell'ordine:
try {
// Codice che potrebbe sollevare diverse eccezioni
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}Il gestore generico funge da ripiego per qualsiasi tipo di eccezione che non è stata intercettata dai blocchi precedenti. È particolarmente utile quando lavori con codice che potrebbe generare eccezioni che non avevi previsto, assicurandoti che il programma non vada in crash a causa di errori imprevisti.
Anche se non puoi accedere ai dettagli specifici dell’eccezione in un blocco catch-all, puoi comunque fornire un messaggio di errore generico ed eseguire operazioni di pulizia per far funzionare correttamente il tuo programma.
Sfida
FacileCrea un programma che mostri una gestione completa delle eccezioni utilizzando più blocchi catch, incluso un gestore generico. Questa sfida metterà alla prova la tua comprensione di come gestire sia tipi specifici di eccezioni sia errori imprevisti che non rientrano nelle categorie predefinite.
Verranno forniti i seguenti input:
- Una stringa
testTypeche rappresenta il tipo di test da eseguire ("string_convert","math_operation","array_access"oppure"unknown_error") - Una stringa
value1che verrà utilizzata come dato principale per l'operazione - Una stringa
value2che verrà utilizzata come dato secondario per alcune operazioni
Il tuo programma dovrebbe:
- Creare una funzione denominata
performTestche accetti tre parametri di tipo stringa - All'interno della funzione, utilizzare una struttura if-else per gestire i diversi tipi di test:
- Se testType è
"string_convert": utilizzarestd::stoiper convertire value1 in un intero e stamparlo - Se testType è
"math_operation": convertire sia value1 sia value2 in interi utilizzandostd::stoi, quindi dividere value1 per value2 e stampare il risultato - Se testType è
"array_access": creare una stringa"Programming", convertire value1 in un indice intero utilizzandostd::stoi, quindi utilizzarestr.at(index)per accedere al carattere in quell'indice e stamparlo. Il metodo.at()genera automaticamentestd::out_of_rangese l'indice non è valido: non è necessario controllare manualmente i limiti - Se testType è
"unknown_error": generare un valore intero999 - Nella funzione main, chiamare
performTestall'interno di un bloccotry - Utilizzare più blocchi
catchper gestire le eccezioni in questo ordine esatto: - Primo:
std::invalid_argument&per le conversioni da stringa a numero non valide - Secondo:
std::out_of_range&per i numeri troppo grandi o gli indici di stringa fuori dai limiti - Terzo:
catch(...)come gestore generico per qualsiasi altro tipo di eccezione
Utilizza il seguente formato di output esatto:
Per le operazioni riuscite:
Success: [result_value]Per i diversi tipi di eccezione:
Invalid argument caught
Out of range caught
Unknown exception caughtRicorda che il gestore generico catch(...) deve essere collocato per ultimo, poiché C++ controlla i blocchi catch in ordine. Questo gestore catturerà qualsiasi tipo di eccezione non gestito dai precedenti blocchi catch specifici, inclusa l'eccezione intera generata nel caso "unknown_error". Il gestore generico offre una rete di sicurezza per gli errori imprevisti, consentendo comunque una gestione specifica dei tipi di eccezione noti.
Provalo tu
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Scrivi il tuo codice qui - crea la funzione performTest
int main() {
// Leggi l'input
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Scrivi il tuo codice qui sotto - implementa i blocchi try-catch e chiama performTest
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Puntatori e memoria
Che cos'è un puntatore?Operatore indirizzoOperatore di dereferenziazionePuntatori nulliPuntatori e arrayMemoria dinamica con 'new'Liberare la memoria con 'delete'Riepilogo - Esercizi sui puntatori2Vettori (array dinamici)
Introduzione a std::vectorCreare un vettoreAggiungere elementiAccedere agli elementiDimensione del vettoreIterare con un ciclo forCiclo for basato su intervalloRimuovere elementiRiepilogo - Operazioni sui vettori5Progetto: strumento per l’inventario
Configurazione del progettoAggiunta e aggiornamento degli articoli8Gestione di base degli errori
Introduzione alle eccezioniI blocchi 'try' e 'catch'La parola chiave 'throw'Diversi tipi di eccezioniIl gestore catch-allRiepilogo - Divisione sicura3Progetto: Strumento per l’elenco delle attività
Panoramica del progettoAggiungere un’attivitàEsercitati da solo: Compilatore C++ online