Menu
CoddyTech

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 zu den spezifischen Ausnahmetypen passen, die du vorgesehen hast. Der allgemeine 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 Ausnahmetyp anzugeben. Er muss nach allen anderen catch-Blöcken stehen, da C++ sie der Reihe nach überprüft:

try {
    // Code, der verschiedene Ausnahmen auslösen 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 Ausweichlösung für alle Ausnahmetypen, die nicht von den vorherigen Blöcken abgefangen wurden. Das ist besonders nützlich, wenn du mit Code arbeitest, der Ausnahmen auslösen könnte, mit denen du nicht gerechnet hast, und stellt sicher, dass dein Programm nicht aufgrund unerwarteter Fehler abstürzt.

Auch wenn du in einem allgemeinen catch-Block nicht auf die spezifischen Details der Ausnahme zugreifen kannst, kannst du trotzdem eine allgemeine Fehlermeldung ausgeben und Bereinigungsmaßnahmen durchführen, damit dein Programm reibungslos weiterläuft.

challenge icon

Aufgabe

Einfach

Erstelle ein Programm, das eine umfassende Ausnahmebehandlung mit mehreren catch-Blöcken einschließlich eines Catch-all-Handlers demonstriert. Mit dieser Aufgabe testest du dein Verständnis dafür, wie sowohl bestimmte Ausnahmetypen als auch unerwartete Fehler behandelt werden, die in keine vordefinierten Kategorien passen.

Folgende Eingaben werden bereitgestellt:

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

Dein Programm soll:

  1. Eine Funktion namens performTest erstellen, die drei String-Parameter 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 diese ausgeben
  4. Wenn testType "math_operation" ist: value1 und value2 mit std::stoi in Ganzzahlen umwandeln, dann value1 durch value2 teilen und das Ergebnis ausgeben
  5. Wenn testType "array_access" ist: Einen String "Programming" erstellen, value1 mit std::stoi in einen Ganzzahlindex umwandeln, dann mit str.at(index) auf das Zeichen an diesem Index zugreifen 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 ganzzahligen Wert 999 auslösen
  7. In der main-Funktion performTest innerhalb eines try-Blocks aufrufen
  8. Mehrere catch-Blöcke verwenden, um Ausnahmen in genau dieser Reihenfolge zu behandeln:
  9. Zuerst: std::invalid_argument& für ungültige Umwandlungen von Strings in Zahlen
  10. Zweitens: std::out_of_range& für zu große Zahlen oder einen String-Index außerhalb des gültigen Bereichs
  11. Drittens: catch(...) als Catch-all-Handler für alle anderen Ausnahmetypen

Verwende das folgende genaue Ausgabeformat:

Bei erfolgreichen Operationen:

Success: [result_value]

Bei verschiedenen Ausnahmetypen:

Invalid argument caught
Out of range caught
Unknown exception caught

Beachte, 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 alle Ausnahmetypen ab, die nicht von den vorherigen spezifischen catch-Blöcken behandelt wurden, einschließlich der ganzzahligen Ausnahme, 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 hier deinen Code – erstelle die Funktion performTest

int main() {
    // Eingabe einlesen
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Schreibe unten deinen Code – 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