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:
- Der Code, der einen Fehler verursachen kann, wird in den
try-Block gesetzt. - Wenn im
try-Block eine Ausnahme auftritt (durchthrowerzeugt), wird die normale Programmausführung unterbrochen. - Das System sucht einen passenden
catch-Block, der die erzeugte Ausnahme verarbeiten kann (nach Typ). - Wenn ein entsprechender
catchgefunden wird, wird sein Code ausgeführt. - Wenn kein passender
catchauf 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.