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.
Aufgabe
EinfachErstelle 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:
- Eine Funktion namens
performTesterstellen, die drei String-Parameter 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 diese ausgeben - Wenn testType
"math_operation"ist: value1 und value2 mitstd::stoiin Ganzzahlen umwandeln, dann value1 durch value2 teilen und das Ergebnis ausgeben - Wenn testType
"array_access"ist: Einen String"Programming"erstellen, value1 mitstd::stoiin einen Ganzzahlindex umwandeln, dann mitstr.at(index)auf das Zeichen an diesem Index zugreifen 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 ganzzahligen Wert999auslösen - In der main-Funktion
performTestinnerhalb einestry-Blocks aufrufen - Mehrere
catch-Blöcke verwenden, um Ausnahmen in genau dieser Reihenfolge zu behandeln: - Zuerst:
std::invalid_argument&für ungültige Umwandlungen von Strings in Zahlen - Zweitens:
std::out_of_range&für zu große Zahlen oder einen String-Index außerhalb des gültigen Bereichs - 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 caughtBeachte, 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;
}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