Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Erstelle 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:

  1. Eine Funktion namens validateUser erstellen, die eine Zeichenfolge und eine Ganzzahl als Parameter entgegennimmt
  2. Innerhalb der Funktion prüfen, ob der Benutzername leer ist (Länge 0 hat)
  3. Wenn der Benutzername leer ist, die Zeichenfolge "Username cannot be empty" mit throw auslösen
  4. Prüfen, ob das Alter kleiner als 13 ist
  5. Wenn das Alter kleiner als 13 ist, die Zeichenfolge "Age must be at least 13" mit throw auslösen
  6. Wenn beide Validierungen erfolgreich sind, "User validation successful" ausgeben
  7. In der Hauptfunktion validateUser mit den Eingabewerten aufrufen
  8. Einen try-Block verwenden, um die Funktion aufzurufen, und einen catch-Block, um alle ausgelösten Zeichenfolgen-Ausnahmen zu behandeln

Verwende das folgende exakte Ausgabeformat:

Bei erfolgreicher Validierung:

User validation successful

Bei 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;
}
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

Übe selbstständig: Online-C++-Compiler