Heim >Backend-Entwicklung >C++ >Wie teilt man die Ausnahmehierarchie in der Ausnahmebehandlung von C++-Funktionen auf?

Wie teilt man die Ausnahmehierarchie in der Ausnahmebehandlung von C++-Funktionen auf?

WBOY
WBOYOriginal
2024-04-15 18:48:021127Durchsuche

Die Ausnahmehierarchie in C++ bietet verschiedene Vererbungsebenen von Ausnahmeklassen zur Klassifizierung von Ausnahmesituationen. Diese Hierarchie hat ihren Ursprung in der Klasse std::Exception und umfasst Basisausnahmen, Laufzeitausnahmen und logischere Ausnahmeklassen, die von diesen Basisklassen abgeleitet werden. Durch den Ausnahmebehandlungsmechanismus können Ausnahmen auf verschiedenen Ebenen abgefangen und bei Bedarf entsprechende Maßnahmen ergriffen werden.

C++ 函数异常处理中的异常层级如何划分?

Ausnahmehierarchie in der C++-Funktionsausnahmebehandlung

In C++ kann die Funktionsausnahmebehandlung Ausnahmen melden, indem sie Ausnahmeobjekte auslöst. Um verschiedene Ausnahmesituationen zu klassifizieren, führt C++ die Ausnahmehierarchie ein. Die Ausnahmehierarchie ist eine Vererbungshierarchie von Ausnahmeklassen, die von der Standardbibliothek definiert werden und unterschiedliche Informationsebenen für Ausnahmeobjekte bereitstellen. 1. Ausnahmeklassen-Vererbungshierarchie Ausnahmeklassen in verschiedene Ebenen:

  • Basic Exception (std::Exception): Die Basisklasse, die alle Ausnahmesituationen darstellt.

  • Laufzeitausnahme (std::runtime_error): Zeigt eine Ausnahme an, die auftritt, wenn das Programm ausgeführt wird, z. B. ein Fehler bei der Speicherzuweisung oder beim Öffnen einer Datei.
  • Logische Ausnahme (std::logic_error)std::exception 类为根的继承层次结构:

    class std::exception {
    public:
        virtual ~exception() noexcept = default;
        virtual const char* what() const noexcept = 0;
    };
    
    // 基本异常类
    class std::runtime_error : public std::exception {
    public:
        runtime_error(const char* whatArg) : whatArg_(whatArg) {}
        virtual const char* what() const noexcept override { return whatArg_; }
    
    private:
        const char* whatArg_;
    };
    
    // 派生异常类
    class std::logic_error : public std::runtime_error {
    public:
        logic_error(const char* whatArg) : runtime_error(whatArg) {}
    };

    2. 异常层级划分

    异常层级将异常类分为不同的级别:

    • 基础异常 (std::exception):表示所有异常情况的基类。
    • 运行时异常 (std::runtime_error):表示在程序运行时发生的异常,例如内存分配失败或文件打开失败。
    • 逻辑异常 (std::logic_error):表示程序逻辑中的错误,例如非法参数或无效状态。

    更具体的异常类从 std::runtime_errorstd::logic_error 衍生,例如:

    • std::bad_alloc:内存分配失败。
    • std::invalid_argument:无效参数。
    • std::range_error:范围错误(例如,数组下标越界)。

    3. 实战案例

    考虑以下函数:

    int divide(int numerator, int denominator) {
        if (denominator == 0) {
            throw std::invalid_argument("denominator cannot be zero");
        }
        return numerator / denominator;
    }

    denominator 为 0 时,此函数抛出 std::invalid_argument 异常。该异常属于 std::logic_error 层级,表示程序逻辑中一个无效的参数错误。

    在调用 divide 函数时,你可以使用异常处理机制来捕获异常:

    try {
        int result = divide(10, 2);
        std::cout << "Result: " << result << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    在这种情况下,当 denominator 为 0 时,将捕获 std::invalid_argument: Zeigt Fehler in der Programmlogik an, z. B. ungültige Parameter oder ungültiger Status.

Spezifischere Ausnahmeklassen werden von std::runtime_error und std::logic_error abgeleitet, zum Beispiel: 🎜
  • std::bad_alloc: Speicherzuweisung fehlgeschlagen.
  • std::invalid_argument: Ungültiger Parameter.
  • std::range_error: Bereichsfehler (z. B. Array-Index außerhalb der Grenzen).
🎜🎜3. Praktischer Fall 🎜🎜🎜Betrachten Sie die folgende Funktion: 🎜rrreee🎜Wenn denominator 0 ist, löst diese Funktion den Code std::invalid_argument aus >Ausnahme. Diese Ausnahme gehört zur Ebene <code>std::logic_error und stellt einen ungültigen Parameterfehler in der Programmlogik dar. 🎜🎜Wenn Sie die Funktion divide aufrufen, können Sie den Ausnahmebehandlungsmechanismus verwenden, um Ausnahmen abzufangen: 🎜rrreee🎜Wenn in diesem Fall der Nenner 0 ist, wird std::invalid_argument löst eine Ausnahme aus und gibt eine Fehlermeldung aus. 🎜

Das obige ist der detaillierte Inhalt vonWie teilt man die Ausnahmehierarchie in der Ausnahmebehandlung von C++-Funktionen auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

In Verbindung stehende Artikel

Mehr sehen