Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Crea 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 testType che rappresenta il tipo di test da eseguire ("string_convert", "math_operation", "array_access" oppure "unknown_error")
  • Una stringa value1 che verrà utilizzata come dato principale per l'operazione
  • Una stringa value2 che verrà utilizzata come dato secondario per alcune operazioni

Il tuo programma dovrebbe:

  1. Creare una funzione denominata performTest che accetti tre parametri di tipo stringa
  2. All'interno della funzione, utilizzare una struttura if-else per gestire i diversi tipi di test:
  3. Se testType è "string_convert": utilizzare std::stoi per convertire value1 in un intero e stamparlo
  4. Se testType è "math_operation": convertire sia value1 sia value2 in interi utilizzando std::stoi, quindi dividere value1 per value2 e stampare il risultato
  5. Se testType è "array_access": creare una stringa "Programming", convertire value1 in un indice intero utilizzando std::stoi, quindi utilizzare str.at(index) per accedere al carattere in quell'indice e stamparlo. Il metodo .at() genera automaticamente std::out_of_range se l'indice non è valido: non è necessario controllare manualmente i limiti
  6. Se testType è "unknown_error": generare un valore intero 999
  7. Nella funzione main, chiamare performTest all'interno di un blocco try
  8. Utilizzare più blocchi catch per gestire le eccezioni in questo ordine esatto:
  9. Primo: std::invalid_argument& per le conversioni da stringa a numero non valide
  10. Secondo: std::out_of_range& per i numeri troppo grandi o gli indici di stringa fuori dai limiti
  11. 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 caught

Ricorda 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;
}
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 C++ online