Ausnahmebehandlung ist ein Mechanismus, der es einem Programm ermöglicht, auf unerwartete oder außergewöhnliche Laufzeitbedingungen zu reagieren und angemessen darauf zu antworten, anstatt abzustürzen oder undefiniertes Verhalten zu erzeugen.
Eine Ausnahme auslösen:
throw std::runtime_error("Ein Fehler ist aufgetreten!");Eine Ausnahme fangen und behandeln:
try {
// Code, der möglicherweise eine Ausnahme auslöst
throw std::runtime_error("Ein Fehler ist aufgetreten!");
} catch (const std::runtime_error &e) {
std::cerr << "Runtime error: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Ein unbekannter Fehler ist aufgetreten!" << std::endl;
}C++ stellt eine Reihe von Standardausnahmeklassen im Header
<stdexcept> zur Verfügung, darunter:
std::exception: Die allgemeine Basisklasse für alle
Standard-C++-Ausnahmen.std::runtime_error: Für Fehler, die zur Laufzeit
erkannt werden.std::logic_error: Für Fehler, die durch fehlerhafte
Programmlogik entstehen.Viele weitere spezifische Ausnahmeklassen sind abgeleitet von diesen Basisklassen.
Man kann auch eigene Ausnahmeklassen erstellen, indem man von
std::exception oder einer seiner abgeleiteten Klassen
erbt:
class MyException : public std::exception {
const char* what() const noexcept override {
return "Mein eigener Fehler!";
}
};Die Ausnahmebehandlung in C++ bietet einen strukturierten Weg, um auf unerwartete oder ungewöhnliche Laufzeitbedingungen zu reagieren. Durch das Verständnis und die richtige Anwendung dieses Mechanismus können Entwickler robusteren und zuverlässigeren Code schreiben, der in der Lage ist, Fehlerbedingungen elegant zu behandeln.
Assertions sind eine Methode, um während der Entwicklungsphase die
Korrektheit von Annahmen im Code zu überprüfen. Ein Assertion-Statement
prüft eine Bedingung, und wenn die Bedingung false ergibt,
wird das Programm mit einer Fehlermeldung abgebrochen. Dies hilft
Entwicklern, Fehler oder inkorrekte Annahmen frühzeitig im
Entwicklungsprozess zu erkennen.
In C++ wird die Assertion-Funktionalität über das Makro
assert bereitgestellt, das im Header
<cassert> (oder <assert.h> in C)
definiert ist.
Ein einfaches Beispiel:
#include <cassert>
int main() {
int x = 5;
x += 5;
// Dies wird erfolgreich durchlaufen, da x == 10
assert(x == 10);
x -= 5;
// Dies wird einen Assertion-Fehler auslösen, da x != 10
assert(x == 10);
return 0;
}Wenn eine Assertion fehlschlägt, wird standardmäßig eine
Fehlermeldung mit der Datei und der Zeilennummer des fehlgeschlagenen
assert angezeigt und das Programm wird beendet.
Nicht für reguläre Fehlerbehandlung: Assertions sollten nicht als Ersatz für die reguläre Fehlerbehandlung in einem Programm verwendet werden. Sie sind primär für die Entwicklungs- und Debugging-Phase gedacht.
Für interne Invarianten: Assertions sind ideal, um sicherzustellen, dass interne Invarianten oder Annahmen eines Codes erfüllt sind, z. B. dass ein Zeiger nicht NULL ist, bevor darauf zugegriffen wird.
Nicht für externe Eingaben: Assertions sollten nicht zur Validierung von externen Eingaben (z. B. Benutzereingaben oder Daten aus externen Dateien) verwendet werden, da externe Eingaben oft unvorhersehbar sind.
Keine Nebenwirkungen: Das Argument des
assert-Makros sollte keine Nebenwirkungen haben, da das
Makro in Release-Builds entfernt wird und somit der darin enthaltene
Code nicht ausgeführt wird.
In Release-Builds deaktiviert: Standardmäßig
wird assert in Release-Builds (wenn NDEBUG
definiert ist) nicht ausgeführt. Das bedeutet, dass der Code in den
Assertions in einer Release-Version des Programms nicht ausgeführt wird.
Das ist beabsichtigt, da Assertions hauptsächlich während der
Entwicklung nützlich sind.
Assertions in C++ sind ein wertvolles Werkzeug, um während der Entwicklungsphase die Korrektheit von Annahmen im Code zu überprüfen. Sie sollten jedoch nicht als Ersatz für reguläre Fehlerbehandlung oder zur Validierung von externen Eingaben verwendet werden. Stattdessen sind sie am besten geeignet, um sicherzustellen, dass der Code sich so verhält, wie der Entwickler es erwartet.