Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Was ist Exception Handling in C++?

Exception Handling ermöglicht C++‑Programmen, sich bei unerwarteten Laufzeitfehlern kontrolliert zu erholen. Tritt ein Fehler auf, springt die Kontrolle zu einem speziellen Handler, der entscheiden kann, wie darauf reagiert wird.

Indem Sie potenziell problematischen Code in einen try‑Block einschließen und ihm ein oder mehrere catch‑Klauseln folgen lassen, geben Sie dem Programm einen klaren Pfad zur Behandlung außergewöhnlicher Situationen.

Wird keine Exception geworfen, läuft der try‑Block normal ab und die Handler werden übersprungen.

In diesem Tutorial lernen Sie:

Warum Exception Handling?

Exception Handling bietet konkrete Vorteile:

Schlüsselwörter der Exception‑Behandlung

Drei Schlüsselwörter bilden das Rückgrat:

Code innerhalb des try‑Blocks wird als geschützter Code bezeichnet; wirft er eine Exception, wird der zugehörige catch‑Block ausgeführt.

Syntax

try {
    // geschützter Code
} catch (Exception_Typ exception1) {
    // exception1 behandeln
} catch (Exception_Typ exception2) {
    // exception2 behandeln
} // ... weitere catch‑Blöcke

Beispiel 1: Zugriff auf Vector‑Element außerhalb des Bereichs

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    try {
        vec.at(2); // out of range
    } catch (exception& ex) {
        cout << "Exception aufgetreten!" << endl;
    }
    return 0;
}

Ausgabe:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Screenshot des Codes:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Code‑Analyse:

  1. iostream und vector für I/O und Container einbinden.
  2. std‑Namespace nutzen, um vollqualifizierte Namen zu vermeiden.
  3. vector<int> instanziieren und befüllen.
  4. Versuch, ein Element außerhalb der Grenzen im try‑Block zuzugreifen.
  5. Standard‑std::exception abfangen und Meldung ausgeben.
  6. Aus main zurückkehren.

Beispiel 2: Division durch Null behandeln

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {
    if (y == 0) {
        throw "Division durch Null!";
    }
    return static_cast<double>(x) / y;
}
int main() {
    int a = 11, b = 0;
    double c = 0;
    try {
        c = zeroDivision(a, b);
        cout << c << endl;
    } catch (const char* message) {
        cerr << message << endl;
    }
    return 0;
}

Ausgabe:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Screenshot des Codes:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Code‑Analyse:

  1. zeroDivision definieren, das einen C‑String wirft, wenn durch Null geteilt wird.
  2. Funktion im try‑Block aufrufen und Ergebnis ausgeben.
  3. String‑Exception abfangen und Fehlermeldung ausgeben.

C++ Standard‑Exceptions

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Die Standardbibliothek deklariert in <exception> eine reiche Exception‑Hierarchie. Hier die häufigsten:

ExceptionBeschreibung
std::exceptionBasisklasse für alle Standard‑Exceptions.
std::bad_allocWird von new bei Allokationsfehler geworfen.
std::bad_castWird von dynamic_cast bei fehlgeschlagenem Cast geworfen.
std::bad_exceptionSignalisiert eine unerwartete Exception.
std::bad_typeidWird von typeid auf einen null‑glvalue eines polymorphen Typs geworfen.
std::logic_errorFehler, die der Programmierer erkennen können sollte.
std::domain_errorUngültiger Definitionsbereich für mathematische Funktion.
std::invalid_argumentFunktion erhielt ungültiges Argument.
std::length_errorVersuch, einen zu großen String zu erzeugen.
std::out_of_rangeWird von vector::at bei Index außerhalb geworfen.
std::runtime_errorLaufzeitfehler, die keine andere Kategorie treffen.
std::overflow_errorMathematischer Überlauf aufgetreten.
std::range_errorWert außerhalb des gültigen Bereichs für die Operation.
std::underflow_errorMathematischer Unterlauf aufgetreten.

Benutzerdefinierte Exceptions

Die Basisklasse std::exception kann erweitert werden, um domänenspezifische Fehlertypen zu schaffen. Das Überschreiben von what() liefert eine beschreibende Nachricht.

Beispiel: Eigene Exception

#include <iostream>
#include <exception>
using namespace std;
class NewException : public exception {
public:
    const char* what() const noexcept override {
        return "newException aufgetreten";
    }
} newex;
int main() {
    try {
        throw newex;
    } catch (exception& ex) {
        cout << ex.what() << '\n';
    }
    return 0;
}

Ausgabe:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Screenshot des Codes:

C++ Exception Handling meistern: Praktische try, catch, throw Beispiele

Code‑Analyse:

  1. NewException von std::exception ableiten und what() überschreiben.
  2. Objekt newex instanziieren zum Werfen.
  3. newex im try‑Block werfen.
  4. Per Referenz auf std::exception abfangen und Nachricht via what() ausgeben.

Merksätze

C Sprache

  1. C++-Kommentare: Best Practices für lesbaren, wartbaren Code
  2. Python Exception Handling meistern: try, except, else und finally erklärt
  3. Java Exception Handling meistern: Try, Catch, Finally, Throw & Throws erklärt
  4. Java Exception Handling meistern: Try, Catch, Finally und Ressourcen
  5. C++ switch‑case meistern: Syntax, Einsatz und Praxisbeispiele
  6. C++ Dynamische Array‑Allokation: Praktischer Leitfaden mit Code‑Beispielen
  7. C++ Structs erklärt mit praktischem Beispiel
  8. std::list in C++ meistern: Syntax, Funktionen & praktische Beispiele
  9. C++ Struct vs. Class: Wichtige Unterschiede, Syntax und beste Anwendungsfälle
  10. 15 beste C++ IDEs für Windows, macOS & Linux – Kostenlose & kostenpflichtige Optionen (2021)