Das 'throw'-Schlüsselwort
Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy. Lektion 50 von 56.
Manchmal musst du signalisieren, dass in deinem eigenen Code ein Fehler aufgetreten ist, anstatt nur Ausnahmen abzufangen, die von anderen Funktionen ausgelöst wurden. Mit dem Schlüsselwort throw kannst du manuell eine Ausnahme auslösen, wenn dein Programm ein Problem erkennt.
Du kannst verschiedene Arten von Werten als Ausnahmen auslösen – Ganzzahlen, Zeichenketten oder sogar benutzerdefinierte Objekte. Hier ist die grundlegende Syntax:
if (someErrorCondition) {
throw "Error message"; // Wirft ein String-Literal
}Wenn du throw verwendest, wird die Ausführung der aktuellen Funktion sofort angehalten, und das Programm sucht nach einem catch-Block, der den ausgelösten Wert verarbeiten kann. Das ist besonders nützlich, um Eingaben zu validieren oder Bedingungen zu überprüfen, die während der normalen Programmausführung nicht auftreten sollten.
Hier ist ein praktisches Beispiel dafür, wie eine Ausnahme ausgelöst wird, wenn eine ungültige Eingabe erkannt wird:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}Der Aufrufer umschließt den Aufruf mit einem try-Block. Ein ausgelöstes Zeichenfolgenliteral hat den Typ const char*, daher gibt der catch-Block diesen Typ an, und sein Parameter enthält die Meldung:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// Ausgabe: Error: Age cannot be negative!Mit dem Schlüsselwort throw kannst du steuern, wann und wie Fehler in deinen Programmen gemeldet werden. Dadurch werden deine Funktionen robuster und vorhersehbarer, wenn sie mit ungültigen Bedingungen umgehen.
Aufgabe
EinfachErstelle ein Programm, das eine Eingabevalidierung mithilfe des Schlüsselworts throw implementiert, um manuell Ausnahmen auszulösen, wenn ungültige Bedingungen erkannt werden. Diese Aufgabe prüft dein Verständnis dafür, wie du mit throw in deinen eigenen Funktionen Fehler signalisierst.
Es werden die folgenden Eingaben bereitgestellt:
- Eine Zeichenfolge
username, die den gewählten Benutzernamen einer Person darstellt (diese Zeile kann leer sein) - Eine Ganzzahl
age, die das Alter der Person darstellt
Dein Programm sollte Folgendes tun:
- Eine Funktion namens
validateUsererstellen, die eine Zeichenfolge und eine Ganzzahl als Parameter entgegennimmt - Innerhalb der Funktion prüfen, ob der Benutzername leer ist (Länge 0 hat)
- Wenn der Benutzername leer ist, die Zeichenfolge
"Username cannot be empty"mitthrowauslösen - Prüfen, ob das Alter kleiner als 13 ist
- Wenn das Alter kleiner als 13 ist, die Zeichenfolge
"Age must be at least 13"mitthrowauslösen - Wenn beide Validierungen erfolgreich sind,
"User validation successful"ausgeben - In der Hauptfunktion
validateUsermit den Eingabewerten aufrufen - Einen
try-Block verwenden, um die Funktion aufzurufen, und einencatch-Block, um alle ausgelösten Zeichenfolgen-Ausnahmen zu behandeln
Verwende das folgende exakte Ausgabeformat:
Bei erfolgreicher Validierung:
User validation successfulBei Validierungsfehlern:
Validation error: [error_message]Denke daran: Wenn du throw verwendest, wird die Ausführung der aktuellen Funktion sofort beendet und nach einem passenden catch-Block gesucht. Der catch-Block sollte den Typ const char* angeben, um die ausgelösten Zeichenfolgenliterale zu behandeln. Wenn die erste Validierung fehlschlägt, löst die Funktion eine Ausnahme aus und fährt nicht mit der Prüfung der zweiten Bedingung fort.
Probier es selbst
#include <iostream>
#include <string>
using namespace std;
// TODO: Schreibe die Funktion validateUser hier, oberhalb von main
// Sie nimmt einen string username und ein int age entgegen und wirft ein Stringliteral, wenn eine Prüfung fehlschlägt
int main() {
// Eingabe einlesen
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: Rufe validateUser innerhalb eines try-Blocks auf
// und fange die geworfene Meldung mit catch (const char* error) ab
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