C++ Ausnahmebehandlung: Try, Catch, Throw-Beispiel

Was ist Ausnahmebehandlung in C++?

Ausnahmebehandlung in C++ bietet Ihnen eine Möglichkeit, unerwartete Umstände wie Laufzeitfehler zu behandeln. Wenn also ein unerwarteter Umstand eintritt, wird die Programmsteuerung an spezielle Funktionen, sogenannte Handler, übertragen.

Um die Ausnahmen abzufangen, stellen Sie einen Codeabschnitt unter Ausnahmeprüfung. Der Codeabschnitt wird innerhalb des Try-Catch-Blocks platziert.

Wenn in diesem Codeabschnitt eine Ausnahmesituation auftritt, wird eine Ausnahme ausgelöst. Als nächstes übernimmt der Ausnahmebehandler die Kontrolle über das Programm.

Falls kein außergewöhnlicher Umstand eintritt, wird der Code normal ausgeführt. Die Handler werden ignoriert.

In diesem C++ Tutorial lernen Sie:

Warum Ausnahmebehandlung?

Hier sind die Gründe für die Verwendung von Ausnahmebehandlung in C++:

  • Sie trennen Ihren Fehlerbehandlungscode von Ihrem normalen Code. Der Code ist dadurch besser lesbar und einfacher zu warten.
  • Funktionen können die von ihnen ausgewählten Ausnahmen behandeln. Selbst wenn eine Funktion viele Ausnahmen auslöst, behandelt sie nur einige. Der Aufrufer wird die nicht abgefangenen Ausnahmen behandeln.

Schlüsselwörter für die Ausnahmebehandlung

Ausnahmebehandlung in C++ dreht sich um diese drei Schlüsselwörter:

  • werfen– Wenn ein Programm auf ein Problem stößt, löst es eine Ausnahme aus. Das Schlüsselwort throw hilft dem Programm, den Wurf auszuführen.
  • Fang– Ein Programm verwendet einen Ausnahmehandler, um eine Ausnahme abzufangen. Es wird dem Abschnitt eines Programms hinzugefügt, in dem Sie das Problem beheben müssen. Dies geschieht mit dem Schlüsselwort „catch“.
  • versuchen– Der Try-Block identifiziert den Codeblock, für den bestimmte Ausnahmen aktiviert werden. Es sollten ein oder mehrere Catch-Blöcke folgen.

Angenommen, ein Codeblock löst eine Ausnahme aus. Die Ausnahme wird von einer Methode abgefangen, die die Schlüsselwörter „try“ und „catch“ verwendet. Der try/catch-Block sollte Code umgeben, der möglicherweise eine Ausnahme auslöst. Ein solcher Code wird als geschützter Code bezeichnet.

Syntax

Der Try/Catch verwendet diese Syntax:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Obwohl wir eine Try-Anweisung haben, können wir viele Catch-Anweisungen haben.
  • Der ExceptionName ist der Name der abzufangenden Ausnahme.
  • Ausnahme1, Ausnahme2 und AusnahmeN sind Ihre definierten Namen für die Bezugnahme auf die Ausnahmen.

Beispiel 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Ausgang:

Schlüsselwörter für die Ausnahmebehandlung

Hier ist ein Screenshot des Codes:

Schlüsselwörter für die Ausnahmebehandlung

Code-Erklärung:

  1. Fügen Sie die iostream-Headerdatei in das Programm ein, um sie zu verwenden Funktionen.
  2. Binden Sie die Vektor-Header-Datei in das Programm ein, um dessen Funktionen zu nutzen.
  3. Fügen Sie den std-Namespace in das Programm in seine Klassen ein, ohne ihn aufzurufen.
  4. Rufen Sie die Funktion main() auf. Die Programmlogik sollte in den Hauptteil eingefügt werden.
  5. Erstellen Sie einen Vektor mit dem Namen vec, um ganzzahlige Daten zu speichern.
  6. Fügen Sie das Element 0 zum Vektor mit dem Namen vec hinzu.
  7. Fügen Sie das Element 1 zum Vektor mit dem Namen vec hinzu.
  8. Ein Kommentar. Es wird von übersprungen C++ Compiler.
  9. Verwenden Sie die try-Anweisung, um eine Ausnahme abzufangen. Das { markiert den Anfang des Hauptteils des try/catch-Blocks. Der im Textkörper hinzugefügte Code wird zum geschützten Code.
  10. Versuchen Sie, auf das Element zuzugreifen, das an Index 2 (drittes Element) des Vektors mit dem Namen vec gespeichert ist. Dieses Element existiert nicht.
  11. Ende des Rumpfes des Try/Catch-Blocks.
  12. Fangen Sie die Ausnahme ab. Die zurückgegebene Fehlermeldung wird in der Variablen ex gespeichert.
  13. Gibt eine Meldung auf der Konsole aus, wenn die Ausnahme abgefangen wird.
  14. Ende des Körpers des Fangblocks.
  15. Das Programm sollte bei erfolgreicher Ausführung einen Wert zurückgeben.
  16. Ende des main()-Funktionskörpers.

Beispiel 2:

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

Ausgang:

Schlüsselwörter für die Ausnahmebehandlung

Hier ist ein Screenshot des Codes:

Schlüsselwörter für die Ausnahmebehandlung

Code-Erklärung:

  1. Fügen Sie die iostream-Header-Datei in das Programm ein, um dessen Funktionen zu nutzen.
  2. Fügen Sie den std-Namespace in das Programm in seine Klassen ein, ohne ihn aufzurufen.
  3. Erstellen Sie eine Funktion namens zeroDivision, die zwei ganzzahlige Argumente annimmt, x und y. Die Funktion sollte ein doppeltes Ergebnis zurückgeben.
  4. Verwenden Sie eine if-Anweisung, um zu prüfen, ob der Wert des Variablenarguments y 0 ist. Das { markiert den Anfang des if-Körpers.
  5. Die Nachricht, die zurückgegeben/ausgeworfen werden soll, wenn y 0 ist.
  6. Ende des Hauptteils der if-Anweisung.
  7. Die Funktion „zeroDivision“ sollte den Wert von x/y zurückgeben.
  8. Ende des Hauptteils der Funktion „zeroDivision“.
  9. Rufen Sie die Methode main() auf. Das { markiert den Anfang dieser Methode.
  10. Deklarieren Sie eine Ganzzahlvariable und weisen Sie ihr den Wert 11 zu.
  11. Deklarieren Sie eine ganzzahlige Variable b und weisen Sie ihr den Wert 0 zu.
  12. Deklarieren Sie eine Double-Variable c und weisen Sie ihr den Wert 0 zu.
  13. Verwenden Sie die try-Anweisung, um eine Ausnahme abzufangen. Das { markiert den Anfang des Hauptteils des try/catch-Blocks. Der im Textkörper hinzugefügte Code wird zum geschützten Code.
  14. Rufen Sie die Funktion ZeroDivision auf und übergeben Sie die Argumente a und b, also 11 und 0. Das Ergebnis dieser Operation wird in der Variablen c gespeichert.
  15. Geben Sie den Wert der Variablen c auf der Konsole aus.
  16. Ende des Rumpfes des Try/Catch-Blocks.
  17. Fangen Sie die Ausnahme ab. Die zurückgegebene Fehlermeldung wird in der Variablen message gespeichert.
  18. Drucken Sie die zurückgegebene Fehlermeldung auf der Konsole aus.
  19. Ende des Körpers des Fangblocks.
  20. Das Programm sollte bei erfolgreicher Ausführung einen Wert zurückgeben.
  21. Ende des main()-Funktionskörpers.

C++ Standardausnahmen

C++ Standardausnahmen

C++ kommt mit einer Liste von Standardausnahmen, die in Klasse. Diese werden im Folgenden beschrieben:

Exception Beschreibung
std::Exception Dies ist eine Ausnahme und die übergeordnete Klasse aller Standard C++ Ausnahmen.
std::bad_alloc Diese Ausnahme wird durch ein neues Schlüsselwort ausgelöst.
std::bad_cast Dies ist eine von Dynamic_cast ausgelöste Ausnahme.
std::bad_Exception Ein nützliches Gerät zur Behandlung unerwarteter Ausnahmen in C++ Programme.
std::bad_typeid Eine von typeid ausgelöste Ausnahme.
std::logic_error Diese Ausnahme ist theoretisch durch das Lesen von Code erkennbar.
std::domain_error Dies ist eine Ausnahme, die nach der Verwendung einer mathematisch ungültigen Domäne ausgelöst wird.
std::invalid_argument Eine Ausnahme wird wegen der Verwendung ungültiger Argumente ausgelöst.
std::length_error Eine Ausnahme, die nach dem Erstellen eines großen std::string ausgelöst wird.
std::out_of_range Durch die Methode geworfen.
std::runtime_error Hierbei handelt es sich um eine Ausnahme, die durch Lesen des Codes nicht erkannt werden kann.
std::overflow_error Diese Ausnahme wird nach dem Auftreten eines mathematischen Überlaufs ausgelöst.
std::range_error Diese Ausnahme wird ausgelöst, wenn Sie versuchen, einen Wert außerhalb des Bereichs zu speichern.
std::underflow_error Eine Ausnahme, die nach dem Auftreten eines mathematischen Unterlaufs ausgelöst wird.

Benutzerdefinierte Ausnahmen

Die C++ Mit der Klasse std::exception können wir Objekte definieren, die als Ausnahmen geworfen werden können. Diese Klasse wurde definiert in Header. Die Klasse stellt uns eine virtuelle Memberfunktion mit dem Namen what zur Verfügung.

Diese Funktion gibt eine nullterminierte Zeichenfolge vom Typ char * zurück. Wir können es in abgeleiteten Klassen überschreiben, um eine Ausnahmebeschreibung zu erhalten.

Ejemplo:

#include <iostream>
#include <exception>
using namespace std;

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

Ausgang:

Benutzerdefinierte Ausnahmen

Hier ist ein Screenshot des Codes:

Benutzerdefinierte Ausnahmen

Code-Erklärung:

  1. Fügen Sie die iostream-Header-Datei in unser Programm ein. Wir werden seine Funktionen nutzen, ohne Fehler zu bekommen.
  2. Fügen Sie die Ausnahme-Header-Datei in unser Programm ein. Wir werden seine Funktionen ohne Fehler nutzen.
  3. Fügen Sie den std-Namespace in unser Programm ein, um seine Klassen zu verwenden, ohne ihn aufzurufen.
  4. Erstellen Sie eine neue Klasse namens newException. Diese Klasse erbt die Ausnahmeklasse von C++.
  5. Der Beginn des Klassenkörpers.
  6. Überschreiben Sie die in der Ausnahmeheaderdatei definierte virtuelle Memberfunktion what(). Anschließend beschreiben wir unsere eigene Ausnahme, die neue Ausnahme.
  7. Beginnen Sie mit der Definition der neuen Ausnahme.
  8. Die Nachricht, die zurückgegeben werden soll, wenn die neue Ausnahme abgefangen wird.
  9. Ende der Definition der neuen Ausnahme.
  10. Ende des Hauptteils der Klasse newException. Der Newex ist der Name, der zum Abfangen unserer neuen Ausnahme verwendet wird, nach der die NewException aufgerufen wird.
  11. Rufen Sie die Funktion main() auf. Die Programmlogik sollte in den Hauptteil eingefügt werden. Das { markiert den Anfang seines Körpers.
  12. Verwenden Sie eine try-Anweisung, um den Code zu markieren, in dem wir die Ausnahme markieren müssen. Das { markiert den Anfang des Hauptteils des try/catch-Blocks. Der davon umgebene Code wird geschützt.
  13. Lösen Sie die Newex-Ausnahme aus, wenn sie abgefangen wird.
  14. Ende des Try-Bodys.
  15. Verwenden Sie die Catch-Anweisung, um die Ausnahme abzufangen. Die Ausnahmefehlermeldung wird in der Variablen ex gespeichert.
  16. Drucken Sie die Ausnahmefehlermeldung auf der Konsole aus.
  17. Ende des Hauptteils der Catch-Anweisung.
  18. Das Programm sollte einen Wert zurückgeben, wenn es erfolgreich ausgeführt wird.
  19. Ende des Hauptteils der main()-Funktion.

Zusammenfassung

  • Mit Ausnahmebehandlung in C++können Sie Laufzeitfehler behandeln.
  • Laufzeitfehler sind Fehler, die während der Programmausführung auftreten.
  • Die Ausnahmebehandlung hilft Ihnen, mit unerwarteten Umständen in Ihrem Programm umzugehen.
  • Wenn der unerwartete Umstand eintritt, wird die Programmsteuerung an Handler übergeben.
  • Um eine Ausnahme abzufangen, platzieren Sie einen Codeabschnitt unter dem Try-Catch-Block.
  • Das Schlüsselwort throw hilft dem Programm, Ausnahmen auszulösen und so das Problem zu lösen.
  • Das Schlüsselwort try hilft dabei, den Codeblock zu identifizieren, für den bestimmte Ausnahmen aktiviert werden.
  • Wir können die Funktion what() der Ausnahme-Header-Datei überschreiben, um unsere Ausnahmen zu definieren.