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 di eccezione specifici per cui ti sei preparato. Il gestore generico catch(...) fornisce una rete di sicurezza che intercetta qualsiasi eccezione non gestita dai blocchi catch più specifici.
Il gestore generico usa tre puntini (...) invece di specificare un tipo di eccezione particolare. Deve essere posizionato dopo tutti gli altri blocchi catch, poiché C++ li controlla in ordine:
try {
// Codice che potrebbe generare 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 è stato intercettato 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 mantenere il programma in esecuzione senza intoppi.
Sfida
FacileCrea un programma che dimostri una gestione completa delle eccezioni usando più blocchi catch, incluso un gestore catch-all. Questa sfida metterà alla prova la tua comprensione di come gestire sia tipi di eccezione specifici 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"o"unknown_error") - Una stringa
value1che verrà usata come dato principale per l'operazione - Una stringa
value2che verrà usata come dato secondario per alcune operazioni
Il tuo programma dovrebbe:
- Creare una funzione denominata
performTestche accetta tre parametri stringa - All'interno della funzione, usare una struttura if-else per gestire i diversi tipi di test:
- Se testType è
"string_convert": usarestd::stoiper convertire value1 in un intero e stamparlo - Se testType è
"math_operation": convertire sia value1 sia value2 in interi usandostd::stoi, quindi dividere value1 per value2 e stampare il risultato - Se testType è
"array_access": creare una stringa"Programming", convertire value1 in un indice intero usandostd::stoi, quindi usarestr.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 - Usare 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 catch-all per qualsiasi altro tipo di eccezione
Usa 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 catch-all catch(...) deve essere posizionato per ultimo, poiché C++ controlla i blocchi catch in ordine. Questo gestore intercetterà qualsiasi tipo di eccezione che non sia stato gestito dai precedenti blocchi catch specifici, inclusa l'eccezione intera generata nel caso "unknown_error". Il gestore catch-all fornisce una rete di sicurezza per gli errori imprevisti, consentendo al contempo una gestione specifica dei tipi di eccezione noti.
Provalo tu
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Scrivi qui il tuo codice - 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