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.
Aufgabe
EinfachErstellen 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:
- 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: Verwenden Siestd::stoi, um value1 in eine Ganzzahl umzuwandeln und diese auszugeben - Wenn testType
"math_operation"ist: Wandeln Sie sowohl value1 als auch value2 mitstd::stoiin Ganzzahlen um, teilen Sie dann value1 durch value2 und geben Sie das Ergebnis aus - Wenn testType
"array_access"ist: Erstellen Sie einen String"Programming", wandeln Sie value1 mitstd::stoiin einen Ganzzahl-Index um und verwenden Sie dannstr.at(index), um auf das Zeichen an diesem Index zuzugreifen und es auszugeben. Die Methode.at()wirft automatischstd::out_of_range, wenn der Index ungültig ist — eine manuelle Bereichsprüfung ist nicht erforderlich - Wenn testType
"unknown_error"ist: Werfen Sie einen Ganzzahlwert999 - Rufen Sie in der Hauptfunktion
performTestinnerhalb einestry-Blocks auf - Verwenden Sie mehrere
catch-Blöcke, um Ausnahmen in genau dieser Reihenfolge zu behandeln: - Erstens:
std::invalid_argument&für ungültige String-zu-Zahl-Konvertierungen - Zweitens:
std::out_of_range&für zu große Zahlen oder String-Indizes außerhalb des gültigen Bereichs - 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 caughtDenken 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;
}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