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.
Aufgabe
EinfachErstelle 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:
- Eine Funktion namens
performTesterstellen, die drei Zeichenkettenparameter entgegennimmt - Innerhalb der Funktion eine If-Else-Struktur verwenden, um verschiedene Testtypen zu behandeln:
- Wenn testType
"string_convert"ist:std::stoiverwenden, um value1 in eine Ganzzahl umzuwandeln, und sie ausgeben - Wenn testType
"math_operation"ist: sowohl value1 als auch value2 mithilfe vonstd::stoiin Ganzzahlen umwandeln, dann value1 durch value2 teilen und das Ergebnis ausgeben - Wenn testType
"array_access"ist: eine Zeichenkette"Programming"erstellen, value1 mithilfe vonstd::stoiin einen Ganzzahlindex umwandeln, dannstr.at(index)verwenden, um auf das Zeichen an diesem Index zuzugreifen, und es ausgeben. Die Methode.at()löst automatischstd::out_of_rangeaus, wenn der Index ungültig ist: Eine manuelle Bereichsprüfung ist nicht erforderlich - Wenn testType
"unknown_error"ist: einen Ganzzahlwert999auslösen - In der main-Funktion
performTestinnerhalb einestry-Blocks aufrufen - Mehrere
catch-Blöcke verwenden, um Ausnahmen in dieser genauen Reihenfolge zu behandeln: - Erstens:
std::invalid_argument&für ungültige Zeichenketten-zu-Zahl-Konvertierungen - Zweitens:
std::out_of_range&für zu große Zahlen oder Zeichenkettenindizes außerhalb des gültigen Bereichs - 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 caughtDenke 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;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Pointer und Speicher
Was ist ein Pointer?AdressoperatorDereferenzierungsoperatorNull-PointerPointer und ArraysDynamischer Speicher mit 'new'Speicher freigeben mit 'delete'Zusammenfassung – Pointer-Übung2Vektoren (Dynamische Arrays)
Einführung in std::vectorEinen Vector erstellenElemente hinzufügenAuf Elemente zugreifenVector-GrößeIterieren mit einer For-SchleifeRange-based For-SchleifeElemente entfernenZusammenfassung – Vector-Operationen5Projekt: Inventar-Tool
Projekt-SetupArtikel hinzufügen und aktualisieren8Grundlagen der Fehlerbehandlung
Einführung in ExceptionsDie 'try'- und 'catch'-BlöckeDas 'throw'-SchlüsselwortVerschiedene Exception-TypenDer Catch-All-HandlerRückblick - Sichere Division3Projekt: Aufgabenlisten-Tool
ProjektübersichtEine Aufgabe hinzufügenÜbe selbstständig: Online-C++-Compiler