Menu
CoddyTech

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.

challenge icon

Sfida

Facile

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

Il tuo programma dovrebbe:

  1. Creare una funzione denominata performTest che accetta tre parametri stringa
  2. All'interno della funzione, usare una struttura if-else per gestire i diversi tipi di test:
  3. Se testType è "string_convert": usare std::stoi per convertire value1 in un intero e stamparlo
  4. Se testType è "math_operation": convertire sia value1 sia value2 in interi usando 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 usando std::stoi, quindi usare 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. Usare 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 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 caught

Ricorda 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;
}
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