Menu
Coddy logo textTech

Der Catch-All-Handler

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

Manchmal kann Ihr Programm auf unerwartete Fehler stoßen, die nicht in die spezifischen Ausnahmetypen passen, die Sie eingeplant haben. Der Catch-All-Handler catch(...) bietet ein Sicherheitsnetz, das jede Ausnahme abfängt, die nicht von Ihren 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 platziert werden, da C++ diese in der Reihenfolge prüft:

try {
    // Code that might throw various exceptions
} 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 fungiert als Fallback für jeden Exception-Typ, der nicht von den vorherigen Blöcken abgefangen wurde. Dies ist besonders nützlich bei der Arbeit mit Code, der Ausnahmen auslösen könnte, die Sie nicht vorhergesehen haben, und stellt sicher, dass Ihr Programm nicht aufgrund unerwarteter Fehler abstürzt.

Obwohl Sie in einem Catch-All-Block nicht auf die spezifischen Details der Ausnahme zugreifen können, können Sie dennoch eine allgemeine Fehlermeldung ausgeben und Bereinigungsoperationen durchführen, damit Ihr Programm reibungslos weiterläuft.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein Programm, das eine umfassende Ausnahmebehandlung unter Verwendung mehrerer catch-Blöcke, einschließlich eines Catch-All-Handlers, demonstriert. Diese Herausforderung testet Ihr Verständnis dafür, wie man sowohl spezifische Ausnahmetypen als auch unerwartete Fehler behandelt, die nicht in vordefinierte Kategorien passen.

Die folgenden Eingaben werden bereitgestellt:

  • Ein String testType, der den Typ des auszuführenden Tests darstellt ("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 als sekundäre Daten für einige Operationen verwendet wird

Ihr Programm sollte:

  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: Verwenden Sie std::stoi, um value1 in eine Ganzzahl umzuwandeln und diese auszugeben
  4. Wenn testType "math_operation" ist: Wandeln Sie sowohl value1 als auch value2 mit std::stoi in Ganzzahlen um, teilen Sie dann value1 durch value2 und geben Sie das Ergebnis aus
  5. Wenn testType "array_access" ist: Erstellen Sie einen String "Programming", wandeln Sie value1 mit std::stoi in einen Ganzzahl-Index um und verwenden Sie dann str.at(index), um auf das Zeichen an diesem Index zuzugreifen und es auszugeben. Die Methode .at() wirft automatisch std::out_of_range, wenn der Index ungültig ist — eine manuelle Bereichsprüfung ist nicht erforderlich
  6. Wenn testType "unknown_error" ist: Werfen Sie einen Ganzzahlwert 999
  7. Rufen Sie in der Hauptfunktion performTest innerhalb eines try-Blocks auf
  8. Verwenden Sie mehrere catch-Blöcke, um Ausnahmen in genau dieser Reihenfolge zu behandeln:
  9. Erstens: std::invalid_argument& für ungültige String-zu-Zahl-Konvertierungen
  10. Zweitens: std::out_of_range& für zu große Zahlen oder String-Indizes außerhalb des gültigen Bereichs
  11. Drittens: catch(...) als Catch-All-Handler für alle anderen Ausnahmetypen

Verwenden Sie das folgende genaue Ausgabeformat:

Für erfolgreiche Operationen:

Success: [result_value]

Für verschiedene Ausnahmetypen:

Invalid argument caught
Out of range caught
Unknown exception caught

Denken Sie daran, dass der Catch-All-Handler catch(...) zuletzt platziert werden muss, da C++ 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 im Fall "unknown_error" geworfenen Ganzzahl-Ausnahme. Der Catch-All-Handler bietet ein Sicherheitsnetz für unerwartete Fehler, während er dennoch eine spezifische Behandlung für bekannte Ausnahmetypen ermöglicht.

Spickzettel

Der Catch-All-Handler catch(...) bietet ein Sicherheitsnetz, das jede Ausnahme abfängt, die nicht von spezifischen catch-Blöcken behandelt wurde.

Der Catch-All-Handler verwendet drei Punkte (...) und muss nach allen anderen catch-Blöcken platziert werden, da C++ diese in der Reihenfolge ihrer Definition prüft:

try {
    // Code that might throw various exceptions
} 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 fungiert als Fallback für jeden Ausnahmetyp, der nicht von vorherigen Blöcken abgefangen wurde. Obwohl Sie in einem Catch-All-Block nicht auf spezifische Details der Ausnahme zugreifen können, können Sie allgemeine Fehlermeldungen ausgeben und Bereinigungsoperationen durchführen.

Probier es selbst

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

// TODO: Schreiben Sie hier Ihren Code - erstellen Sie die Funktion performTest

int main() {
    // Eingabe lesen
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Schreiben Sie Ihren Code unten - implementieren Sie try-catch-Blöcke und rufen Sie 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