Sobes.tech
Junior

Was sind Ausnahmen in C++?

sobes.tech KI

Antwort von AI

Mechanismus zur Behandlung anomaler Situationen (Fehler), die während der Programmausführung auftreten. Ermöglicht die Trennung des Codes, der für die Logik des Programms verantwortlich ist, vom Fehlerbehandlungscode.

Schlüsselwörter:

  • try: Definiert einen Codeblock, in dem Ausnahmen auftreten können.
  • catch: Definiert einen Codeblock, der ausgeführt wird, wenn ein bestimmter Ausnahmetyp auftritt.
  • throw: Generiert (erstellt) eine Ausnahme. Der Ausnahmetyp kann ein beliebiges Objekt sein.

Funktionsprinzip:

  1. Der Code, der einen Fehler verursachen kann, wird in den try-Block gesetzt.
  2. Wenn im try-Block eine Ausnahme auftritt (durch throw erzeugt), wird die normale Programmausführung unterbrochen.
  3. Das System sucht einen passenden catch-Block, der die erzeugte Ausnahme verarbeiten kann (nach Typ).
  4. Wenn ein entsprechender catch gefunden wird, wird sein Code ausgeführt.
  5. Wenn kein passender catch auf der aktuellen Aufrufebene gefunden wird, "verbreitet" sich die Ausnahme nach oben im Aufrufstapel, bis eine geeignete Handhabungsfunktion gefunden wird (oder das Programm endet fehlerhaft).

Beispiel:

#include <iostream>
#include <stdexcept> // Für Standard-Ausnahmetypen

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division durch Null!"); // Erzeugt eine Ausnahme
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Ruft eine Funktion auf, die eine Ausnahme werfen kann
        std::cout << "Ergebnis: " << result << std::endl; // Diese Zeile wird nicht ausgeführt
    } catch (const std::runtime_error& e) { // Fängt die Ausnahme vom Typ std::runtime_error
        std::cerr << "Fehler: " << e.what() << std::endl; // Verarbeitet die Ausnahme
    } catch (...) { // Fängt alle anderen Ausnahmen (Ellipsis)
        std::cerr << "Ein unbekannter Fehler ist aufgetreten." << std::endl;
    }

    std::cout << "Programm setzt nach Fehlerbehandlung fort." << std::endl;
    return 0;
}

Vorteile:

  • Trennung von Logik und Fehlerbehandlung.
  • Vereinfachung des Hauptflusses des Codes.
  • Möglichkeit, Fehler auf verschiedenen Hierarchieebenen zu behandeln.

Nachteile:

  • Kann die Leistung beeinträchtigen (aufgrund der Stapelpropagation).
  • Schwierigkeit, den Ablauf bei mehreren Ausnahmen zu verstehen.
  • Unsachgemäßer Gebrauch kann zu Ressourcenlecks führen (wenn Ressourcen nicht vorzeitig bei Ausnahme freigegeben werden).

Um sicher mit Ressourcen bei Ausnahmen zu arbeiten, werden häufig RAII (Resource Acquisition Is Initialization) und intelligente Zeiger verwendet.