C++-Ausnahmebehandlung
Eine Ausnahme ist ein Problem, das während der Ausführung eines Programms auftritt. Eine C++-Ausnahme ist eine Reaktion auf einen außergewöhnlichen Umstand, der während der Ausführung eines Programms auftritt, z. B. der Versuch, durch Null zu dividieren.
Ausnahmen bieten eine Möglichkeit, die Kontrolle von einem Teil eines Programms auf einen anderen zu übertragen. Die C++-Ausnahmebehandlung basiert auf drei Schlüsselwörtern:try, catch, und werfen .
-
werfen − Ein Programm wirft eine Ausnahme, wenn ein Problem auftritt. Dies geschieht mit einem Wurf Schlüsselwort.
-
fangen − Ein Programm fängt eine Ausnahme mit einem Ausnahmebehandler an der Stelle in einem Programm ab, an der Sie das Problem behandeln möchten. Der Fang Schlüsselwort gibt das Abfangen einer Ausnahme an.
-
versuchen − Ein Versuch block identifiziert einen Codeblock, für den bestimmte Ausnahmen aktiviert werden. Darauf folgen ein oder mehrere catch-Blöcke.
Unter der Annahme, dass ein Block eine Ausnahme auslöst, fängt eine Methode eine Ausnahme mit einer Kombination aus try ab und fangen Schlüsselwörter. Ein Try/Catch-Block wird um den Code platziert, der möglicherweise eine Ausnahme generiert. Code innerhalb eines Try/Catch-Blocks wird als geschützter Code bezeichnet, und die Syntax für die Verwendung von Try/Catch lautet wie folgt:−
try { // protected code } catch( ExceptionName e1 ) { // catch block } catch( ExceptionName e2 ) { // catch block } catch( ExceptionName eN ) { // catch block }
Sie können mehrere Fänge auflisten -Anweisungen, um verschiedene Arten von Ausnahmen abzufangen, falls Sie es versuchen Block löst in verschiedenen Situationen mehr als eine Ausnahme aus.
Ausnahmen auslösen
Ausnahmen können überall innerhalb eines Codeblocks mit throw geworfen werden Aussage. Der Operand der throw-Anweisung bestimmt einen Typ für die Ausnahme und kann ein beliebiger Ausdruck sein, und der Typ des Ergebnisses des Ausdrucks bestimmt den Typ der ausgelösten Ausnahme.
Das Folgende ist ein Beispiel für das Auslösen einer Ausnahme, wenn die Bedingung zum Teilen durch Null auftritt −
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
Abfangen von Ausnahmen
Der Fang Block nach dem try block fängt jede Ausnahme ab. Sie können angeben, welche Art von Ausnahme Sie abfangen möchten, und dies wird durch die Ausnahmedeklaration bestimmt, die in Klammern nach dem Schlüsselwort catch erscheint.
try { // protected code } catch( ExceptionName e ) { // code to handle ExceptionName exception }
Obiger Code fängt eine Ausnahme von ExceptionName ab Typ. Wenn Sie angeben möchten, dass ein catch-Block jede Art von Ausnahme behandeln soll, die in einem try-Block geworfen wird, müssen Sie ein Auslassungszeichen, ..., wie folgt zwischen die Klammern setzen, die die Ausnahmedeklaration einschließen:−
try { // protected code } catch(...) { // code to handle any exception }
Das Folgende ist ein Beispiel, das eine Division-durch-Null-Ausnahme auslöst und wir fangen sie im catch-Block ab.
Live-Demo#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; } catch (const char* msg) { cerr << msg << endl; } return 0; }
Weil wir eine Ausnahme vom Typ const char* auslösen , also müssen wir beim Abfangen dieser Ausnahme const char* im catch-Block verwenden. Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
Division by zero condition!
C++-Standardausnahmen
C++ stellt eine Liste von Standardausnahmen bereit, die in

Hier ist die kleine Beschreibung jeder Ausnahme, die in der obigen Hierarchie erwähnt wird −
Sr.No | Ausnahme &Beschreibung |
---|---|
1 | std::Ausnahme Eine Ausnahme und übergeordnete Klasse aller standardmäßigen C++-Ausnahmen. |
2 | std::bad_alloc Dies kann durch new geworfen werden . |
3 | std::bad_cast Dies kann durch dynamic_cast geworfen werden . |
4 | std::bad_exception Dies ist ein nützliches Gerät, um unerwartete Ausnahmen in einem C++-Programm zu behandeln. |
5 | std::bad_typeid Dies kann durch typeid geworfen werden . |
6 | std::logic_error Eine Ausnahme, die theoretisch durch Lesen des Codes erkannt werden kann. |
7 | std::domain_error Dies ist eine Ausnahme, die ausgelöst wird, wenn eine mathematisch ungültige Domain verwendet wird. |
8 | std::invalid_argument Dies wird aufgrund ungültiger Argumente ausgelöst. |
9 | std::length_error Dies wird geworfen, wenn ein zu großer std::string erstellt wird. |
10 | std::out_of_range Dies kann durch die 'at'-Methode geworfen werden, zum Beispiel ein std::vector und std::bitset<>::operator[](). |
11 | std::runtime_error Eine Ausnahme, die theoretisch nicht durch Lesen des Codes erkannt werden kann. |
12 | std::overflow_error Dies wird ausgelöst, wenn ein mathematischer Überlauf auftritt. |
13 | std::range_error Dies tritt auf, wenn Sie versuchen, einen Wert zu speichern, der außerhalb des zulässigen Bereichs liegt. |
14 | std::underflow_error Dies wird ausgelöst, wenn ein mathematischer Unterlauf auftritt. |
Neue Ausnahmen definieren
Sie können Ihre eigenen Ausnahmen definieren, indem Sie Ausnahme erben und überschreiben Klasse Funktionalität. Das folgende Beispiel zeigt, wie Sie die Klasse std::exception verwenden können, um Ihre eigene Ausnahme auf standardmäßige Weise zu implementieren −
Live-Demo#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //Other errors } }
Dies würde zu folgendem Ergebnis führen −
MyException caught C++ Exception
Hier, was() ist eine öffentliche Methode, die von der Ausnahmeklasse bereitgestellt wird und von allen untergeordneten Ausnahmeklassen überschrieben wurde. Dies gibt die Ursache einer Ausnahme zurück.
C Sprache