Menu
Coddy logo textTech

Der Catch-All-Handler

Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy. Lektion 52 von 56.

Manchmal kann dein Programm auf unerwartete Fehler stoßen, die nicht in die spezifischen Ausnahmearten passen, die du vorgesehen hast. Der Catch-all-Handler catch(...) bietet ein Sicherheitsnetz, das jede Ausnahme abfängt, die nicht von deinen spezifischeren catch-Blöcken behandelt wurde.

Der catch-all-Handler verwendet drei Punkte (...), anstatt einen bestimmten exception-Typ anzugeben. Er muss nach allen anderen catch-Blöcken platziert werden, da C++ sie der Reihe nach prüft:

try {
    // Code, der verschiedene Exceptions werfen könnte
} 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;
}

Der Catch-all-Handler dient als Fallback für jeden Ausnahmetyp, der von den vorherigen Blöcken nicht abgefangen wurde. Dies ist besonders nützlich beim Arbeiten mit Code, der möglicherweise Ausnahmen auslöst, die du nicht vorhergesehen hast, und stellt sicher, dass dein Programm nicht aufgrund unerwarteter Fehler abstürzt.

Auch wenn du in einem catch-all-Block nicht auf die spezifischen Details der exception zugreifen kannst, kannst du dennoch eine allgemeine Fehlermeldung ausgeben und Bereinigungsvorgänge durchführen, damit dein Programm reibungslos weiterläuft.

challenge icon

Aufgabe

Einfach

Erstelle ein Programm, das eine umfassende Ausnahmebehandlung mithilfe mehrerer catch-Blöcke einschließlich eines Catch-all-Handlers demonstriert. Diese Herausforderung testet dein Verständnis dafür, wie sowohl bestimmte Ausnahmetypen als auch unerwartete Fehler behandelt werden, die nicht in vordefinierte Kategorien passen.

Die folgenden Eingaben werden bereitgestellt:

  • Eine Zeichenkette testType, die den auszuführenden Testtyp darstellt ("string_convert", "math_operation", "array_access" oder "unknown_error")
  • Eine Zeichenkette value1, die als primäre Daten für die Operation verwendet wird
  • Eine Zeichenkette value2, die bei einigen Operationen als sekundäre Daten verwendet wird

Dein Programm sollte:

  1. Eine Funktion namens performTest erstellen, die drei Zeichenkettenparameter entgegennimmt
  2. Innerhalb der Funktion eine If-Else-Struktur verwenden, um verschiedene Testtypen zu behandeln:
  3. Wenn testType "string_convert" ist: std::stoi verwenden, um value1 in eine Ganzzahl umzuwandeln, und sie ausgeben
  4. Wenn testType "math_operation" ist: sowohl value1 als auch value2 mithilfe von std::stoi in Ganzzahlen umwandeln, dann value1 durch value2 teilen und das Ergebnis ausgeben
  5. Wenn testType "array_access" ist: eine Zeichenkette "Programming" erstellen, value1 mithilfe von std::stoi in einen Ganzzahlindex umwandeln, dann str.at(index) verwenden, um auf das Zeichen an diesem Index zuzugreifen, und es ausgeben. Die Methode .at() löst automatisch std::out_of_range aus, wenn der Index ungültig ist: Eine manuelle Bereichsprüfung ist nicht erforderlich
  6. Wenn testType "unknown_error" ist: einen Ganzzahlwert 999 auslösen
  7. In der main-Funktion performTest innerhalb eines try-Blocks aufrufen
  8. Mehrere catch-Blöcke verwenden, um Ausnahmen in dieser genauen Reihenfolge zu behandeln:
  9. Erstens: std::invalid_argument& für ungültige Zeichenketten-zu-Zahl-Konvertierungen
  10. Zweitens: std::out_of_range& für zu große Zahlen oder Zeichenkettenindizes außerhalb des gültigen Bereichs
  11. Drittens: catch(...) als Catch-all-Handler für alle anderen Ausnahmetypen

Verwende das folgende exakte Ausgabeformat:

Für erfolgreiche Operationen:

Success: [result_value]

Für verschiedene Ausnahmetypen:

Invalid argument caught
Out of range caught
Unknown exception caught

Denke daran, dass der Catch-all-Handler catch(...) zuletzt platziert werden muss, da C++ die catch-Blöcke der Reihe nach prüft. Dieser Handler fängt jeden Ausnahmetyp ab, der nicht von den vorherigen spezifischen catch-Blöcken behandelt wurde, einschließlich der Ganzzahlausnahme, die im Fall "unknown_error" ausgelöst wird. Der Catch-all-Handler bietet ein Sicherheitsnetz für unerwartete Fehler und ermöglicht gleichzeitig eine spezifische Behandlung bekannter Ausnahmetypen.

Probier es selbst

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: Schreibe deinen Code hier - erstelle die performTest Funktion

int main() {
    // Eingabe lesen
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Schreibe deinen Code unten - implementiere try-catch-Blöcke und rufe performTest auf
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-C++-Compiler