C++-Standardbibliothek<exception>

In der C++-Programmierung ist die Ausnahmebehandlung ein wichtiger Fehlerbehandlungsmechanismus, der es einem Programm ermöglicht, Fehler elegant zu behandeln, anstatt abzustürzen.

In C++ wird die Ausnahmebehandlung üblicherweise mit den Schlüsselwörtern try, catch und throw implementiert. Die Standardbibliothek stellt die Klasse std::exception und ihre abgeleiteten Klassen bereit, um Ausnahmen zu behandeln.

In der C++-Standardbibliothek,<exception>Die Header-Datei stellt eine Reihe von Infrastruktur für die Ausnahmebehandlung bereit, einschließlich Ausnahmeklassen, Ausnahmebehandlungsmechanismen und so weiter.

Eine Ausnahme ist ein Ereignis, das während der Laufzeit eines Programms auftritt und den normalen Befehlsfluss unterbricht. In C++ kann eine Ausnahme ein Objekt eines beliebigen Typs sein, üblicherweise jedoch ein Objekt einer Ausnahmeklasse. Die C++-Standardbibliothek definiert einige grundlegende Ausnahmeklassen, wie zum Beispielstd::exception、std::bad_alloc、std::bad_castusw.

Sie können die Ausnahmebehandlungsfunktionalität erweitern, indem Sie eigene Ausnahmeklassen definieren, oder vorhandene Ausnahmeklassen aus der Standardbibliothek verwenden, um häufige Ausnahmeszenarien zu behandeln.

Syntax

Eine Ausnahme auslösen

In C++ wird das Schlüsselwort throw verwendet, um eine Ausnahme auszulösen, mit folgender Syntax:

throw exception_object;

Ausnahmen abfangen

Verwenden Sie die Schlüsselwörter try und catch, um Ausnahmen abzufangen und zu behandeln, mit folgender Syntax:

try {
    // 可能抛出异常的代码
} catch (exception_type e) {
    // 处理异常的代码
}

Sie können den Typ der abzufangenden Ausnahme angeben oder einen generischen catch-Block verwenden, um alle Arten von Ausnahmen abzufangen:

try {
    // 可能会抛出异常的代码
} catch (const std::exception& e) {
    // 处理 std::exception 及其派生类的异常
} catch (...) {
    // 处理所有其他类型的异常
}

std::exception

std::exception ist eine in der C++-Standardbibliothek definierte Basisklasse und dient als Grundlage für alle Standard-Ausnahmeklassen. Sie definiert virtuelle Funktionen wie what(), die eine Zeichenkette im C-Stil zurückgeben, welche die Ausnahmeinformationen beschreibt.

class exception {
public:
    virtual const char* what() const noexcept;
};

Standard-Ausnahmeklassen

Die C++-Standardbibliothek stellt mehrere von std::exception abgeleitete Ausnahmeklassen bereit, wie std::runtime_error, std::logic_error usw., um gängige Ausnahmeszenarien darzustellen. Sie können je nach der konkreten Ausnahmesituation die geeignete Klasse auswählen.

throw std::runtime_error("Runtime error occurred");
throw std::logic_error("Logic error occurred");

Beispiel

Das Folgende ist eine Verwendung von<exception>Ein einfaches Beispiel für die Header-Datei, das zeigt, wie man Ausnahmen auslöst und abfängt.

Beispiel

#include <iostream>
#include <exception>

class MyException : public std::exception {
public:
    const char* what() const throw() {
        return "Meine benutzerdefinierte Ausnahme";
    }
};

int main() {
    try {
        // Simuliere einen Fehlerzustand
        bool error_condition = true;
        if (error_condition) {
            throw MyException();
        }
    } catch (const std::exception& e) {
        std::cout << "Ausnahme abgefangen: " << e.what() << std::endl;
    }

    return 0;
}

Ausgabeergebnis:

Caught an exception: My custom exception

Exception-Klasse

In C++ stellt die Standardbibliothek einige gängige Exception-Klassen bereit, die alle vonstd::exception, und kann über#include <stdexcept>Include zur Verwendung.

Im Folgenden sind einige gängige C++-Exception-Klassen und ihre Hauptzwecke aufgeführt:

  • std::exception: Die Basisklasse für alle Standard-Exception-Klassen, die die grundlegende Schnittstelle für Exceptions definiert. Sie besitzt eine virtuelle Funktionwhat(), die verwendet wird, um einen C-String zurückzugeben, der die Exception-Informationen beschreibt.

  • std::runtime_error: Bezeichnet einen Laufzeitfehler, normalerweise eine Exception, die durch Probleme in der Programmlogik verursacht wird, wie ungültige Argumente, das Unvermögen, Dateien zu öffnen usw.

    throw std::runtime_error("Runtime error occurred");
  • std::logic_error: Stellt Logikfehler dar, normalerweise Exceptions, die durch Fehler in der Programmlogik verursacht werden, wie fehlgeschlagene logische Zusicherungen und Indexüberschreitungen.

     throw std::logic_error("Logic error occurred");
  • std::invalid_argument: Zeigt an, dass ein an eine Funktion übergebenes Argument ungültig ist.

    throw std::invalid_argument("Invalid argument");
  • std::out_of_range: Zeigt den Zugriff auf ein Objekt außerhalb seines gültigen Bereichs an, wie bei Arrays und Containern.

    throw std::out_of_range("Out of range");
    
  • std::overflow_errorundstd::underflow_error: Zeigt Überlauf oder Unterlauf bei numerischen Berechnungen an.

    throw std::overflow_error("Overflow occurred");
    throw std::underflow_error("Underflow occurred");
    
  • std::bad_alloc: Gibt einen Speicherzuweisungsfehler an.

    throw std::bad_alloc();  // 内存分配失败时抛出
    

Beispiel

#include <iostream>
#include <new> // Headerdatei für std::bad_alloc-Ausnahme einbinden

int main() {
    try {
        // Versuch, eine große Menge Speicher zuzuweisen
        int* largeArray = new int[1000000000000]; // Speicherzuweisungsfehler simulieren
    } catch (const std::bad_alloc& e) {
        // std::bad_alloc-Ausnahme abfangen, Fehlermeldung ausgeben
        std::cerr << "Speicherzuweisung fehlgeschlagen: " << e.what() << std::endl;
    }

    return 0;
}

Ausgabe:

Memory allocation failed: std::bad_alloc

Hinweise

  • Ausnahmen sollten nicht für den normalen Kontrollfluss verwendet werden; sie sollten nur zur Behandlung außergewöhnlicher Situationen eingesetzt werden.
  • Die Ausnahmebehandlung kann die Programmleistung beeinträchtigen, daher sollte sie mit Vorsicht verwendet werden.
  • Stellen Sie sicher, dasscatchBehandeln Sie alle möglichen Ausnahmetypen im Block, um zu verhindern, dass das Programm aufgrund nicht behandelter Ausnahmen abstürzt.

durch die Verwendung von<exception>Mit der Headerdatei können C++-Programmierer Fehlerbedingungen in Programmen effektiver behandeln, was die Robustheit und Zuverlässigkeit des Programms verbessert.

Weitere Erweiterungen