Ausnahmebehandlung in C ++

Ausnahmebehandlung in C ++
Es gibt drei Arten von Softwarefehlern, die existieren. Dies sind Syntaxfehler, Logikfehler und Laufzeitfehler.

Syntaxfehler

Ein fälschlicherweise getippter Ausdruck, Anweisung oder Konstruktion ist ein Syntaxfehler.

Betrachten Sie die folgenden zwei Aussagen:

int arr [] = 1, 2, 3; //richtig
int arr = 1, 2, 3; // Syntaxfehler, fehlt []

Sie sind Definitionen desselben Arrays. Der erste ist korrekt. Der zweite fehlt [], und das ist ein Syntaxfehler. Ein Programm mit einem Syntaxfehler gelingt nicht zu kompilieren. Die Kompilierung schlägt mit einer Fehlermeldung fehl, die den Syntaxfehler angibt. Gut, dass ein Syntaxfehler immer behoben werden kann, wenn der Programmierer weiß, was er tut.

Logikfehler

Ein Logikfehler ist ein Fehler, der vom Programmierer festgelegt wird, wenn eine falsche logische Codierung gemacht wird. Dies kann das Ergebnis der Unwissenheit des Programmierers zu den Programmiersprachenmerkmalen oder einem Missverständnis dessen sein, was das Programm tun sollte.

In dieser Situation wird das Programm erfolgreich zusammengestellt. Das Programm funktioniert einwandfrei, bringt aber falsche Ergebnisse hervor. Ein solcher Fehler kann es sein, eine Schleife 5 -mal zu iterieren, wenn sie 10 Mal iteriert wird. Es kann auch sein, dass eine Schleife unbewusst gemacht wird, um unendlich unendlich zu iterieren. Die einzige Möglichkeit, diese Art von Fehler zu lösen, besteht darin, sorgfältiges Programmieren durchzuführen und das Programm gründlich zu testen.

Laufzeitfehler

Falsche oder außergewöhnliche Eingaben verursachen Laufzeitfehler. In diesem Fall wurde das Programm erfolgreich zusammengestellt und funktioniert in vielen Situationen gut. In bestimmten Situationen stürzt das Programm ab (und stoppt).

Stellen Sie sich vor, in einem Programmcode -Segment muss 8 durch eine Reihe von Nennern geteilt werden. Wenn der Zähler 8 durch den Nenner 4 geteilt wird, wäre die Antwort (Quotienten) 2. Wenn der Benutzer jedoch 0 als Nenner eingibt, würde das Programm abstürzen. Die Abteilung durch 0 ist in der Mathematik nicht erlaubt und ist auch beim Computer nicht erlaubt. Division durch Null sollte bei der Programmierung verhindert werden. Ausnahmebehandlungsfehler wie Division-by-Null-Laufzeitfehler. Das folgende Programm zeigt, wie das Problem von Division by-Null ohne die Ausnahmefunktion in C ++ behandelt wird:

#enthalten
Verwenden von Namespace STD;
int main ()

int numerator = 8;
int nenner = 2;
if (Nenner != 0)

int result = Zähler/Nenner;
Cout << result << '\n';

anders

Cout << "Division by zero is not permitted!" << '\n';

Rückkehr 0;

Die Ausgabe ist 4. Wenn der Nenner 0 wäre, wäre die Ausgabe gewesen:

„Die Teilung durch Null ist nicht zulässig!”

Der Hauptcode hier ist ein IF-ELSE-Konstrukt. Wenn der Nenner nicht 0 ist, findet die Division statt; Wenn es 0 ist, findet die Division nicht statt. Eine Fehlermeldung wird an den Benutzer gesendet, und das Programm wird weiterhin ausgeführt, ohne zu stürzen. Die Laufzeitfehler werden normalerweise behandelt, indem die Ausführung eines Codesegments vermieden und eine Fehlermeldung an den Benutzer gesendet wird.

Die Ausnahmefunktion in C ++ verwendet einen Try-Block für den IF-Block und einen Fangblock für den else-Block, um den Fehler zu bewältigen, genau wie folgt:

#enthalten
Verwenden von Namespace STD;
int main ()

int numerator = 8;
int nenner = 2;
versuchen

if (Nenner != 0)

int result = Zähler/Nenner;
Cout << result << '\n';

anders

0 werfen;


catch (int err)

if (err == 0)
Cout << "Division by zero is not permitted!" << '\n';

Rückkehr 0;

Beachten Sie, dass der Try -Header kein Argument hat. Beachten Sie auch, dass der Catch-Block, der wie eine Funktionsdefinition ist, einen Parameter hat. Die Art des Parameters muss mit dem Operanden (Argument) der Wurfexpression übereinstimmen. Die Wurfexpression ist im Versuchsblock. Es wirft ein Argument der Auswahl des Programmierers aus. Auf diese Weise wird der Code im Try-Block nicht ausgeführt. Anschließend zeigt der Catch-Block die Fehlermeldung an.

Dieser Artikel erläutert die Ausnahmebehandlung in C++. Grundkenntnisse in C ++ ist eine Voraussetzung für den Leser, um diesen Artikel zu verstehen.

Artikelinhalt:

  • Funktionen Sie eine Ausnahme aus
  • Mehr als ein Fangblock für einen Versuchsblock
  • Verschachtelte Try/Fangblöcke
  • Noexcept-Specifier
  • Die spezielle STD :: terminate () -Funktion
  • Abschluss

Funktionen Sie eine Ausnahme:

Eine Funktion kann auch eine Ausnahme wie das, was der Versuch bewirkt. Der Wurf findet innerhalb der Definition der Funktion statt. Das folgende Programm zeigt dies:

#enthalten
Verwenden von Namespace STD;
void fn (const char* str)

if (islower (str [0]))
werfen 'l';

int main ()

versuchen

fn ("Smith");

fangen (char ch)

if (ch == 'l')
Cout << "Person's name cannot begin in lowercase!" << '\n';

Rückkehr 0;

Beachten Sie, dass der Try -Block dieses Mal nur den Funktionsaufruf enthält. Es ist die genannte Funktion, die die Wurfoperation hat. Der Catch -Block fängt die Ausnahme ein und die Ausgabe lautet:

„Der Name der Person kann nicht in Kleinbuchstaben beginnen!”

Diesmal ist der Typ, der geworfen und gefangen ist.

Mehr als ein Fangblock für einen Versuch:

Es kann mehr als einen Fangblock für einen Versuch geben. Stellen Sie sich die Situation vor, in der ein Eingang eines der Zeichen der Tastatur sein kann, aber keine Ziffer und kein Alphabet. In diesem Fall müssen zwei Fangblocks vorhanden sein: eine für eine Ganzzahl, um die Ziffer zu überprüfen, und eines für einen Zeichen, um das Alphabet zu überprüfen. Der folgende Code zeigt dies:

#enthalten
Verwenden von Namespace STD;
char input = '*';
int main ()

versuchen

if (isDigit (Eingabe))
10 werfen;
if (iSalpha (Eingabe))
werfen 'z';

fangen (int)

Cout << "Digit input is forbidden!" << '\n';

fangen (char)

Cout << "Character input is forbidden!" << '\n';

Rückkehr 0;

Es gibt keine Ausgabe. Wenn der Wert der Eingabe eine Ziffer wäre, e.G., '1', die Ausgabe wäre gewesen:

"Zifferner Eingang ist verboten!"

Wenn der Wert der Eingabe ein Alphabet wäre, e.G., 'a', die Ausgabe wäre gewesen:

"Charaktereingabe ist verboten!"

Beachten Sie, dass es in der Parameterliste der beiden Fangblocks keinen Bezeichner-Namen gibt. Beachten Sie auch, dass in der Definition der beiden Fangblocks die speziellen Argumente nicht überprüft wurden, ob ihre Werte genau sind oder nicht.

Was für einen Haken zählt, ist der Typ; Ein Haken muss mit der Art der Operanden übereinstimmen. Der besondere Wert des Arguments (Operand) kann bei Bedarf zur weiteren Überprüfung verwendet werden.

Mehr als ein Handler für denselben Typ

Es ist möglich, zwei Handler des gleichen Typs zu haben. Wenn eine Ausnahme ausgelöst wird, wird die Kontrolle mit einem passenden Typ an den nächsten Handler übertragen. Das folgende Programm zeigt dies:

#enthalten
Verwenden von Namespace STD;
char input = '1';
int main ()

versuchen

if (isDigit (Eingabe))
10 werfen;

fangen (int)

Cout << "Digit input is forbidden!" << '\n';

fangen (int)

Cout << "Not allowed at all: digit input!" << '\n';

Rückkehr 0;

Die Ausgabe ist:

"Zifferner Eingang ist verboten!"

Verschachtelte Versuch/Fangblöcke:

Versuchen/Fangblöcke können verschachtelt werden. Das obige Programm für die Eingabe von nicht alphanumerischen Zeichen aus der Tastatur wird hier wiederholt, aber mit dem alphabetischen Fehlercode verschachtelt:

#enthalten
Verwenden von Namespace STD;
char input = '*';
int main ()

versuchen

if (isDigit (Eingabe))
10 werfen;
versuchen

if (iSalpha (Eingabe))
werfen 'z';

fangen (char)

Cout << "Character input is forbidden!" << '\n';


fangen (int)

Cout << "Digit input is forbidden!" << '\n';

Rückkehr 0;

Der Fehler alphabetischer Versuch/Catch-Block ist im Versuchsblock des Zifferncodes verschachtelt. Der Betrieb dieses Programms und die vorherige Operation, aus der es kopiert wird.

Noexcept-Specifier

Betrachten Sie die folgende Funktion:

void fn (const char* str) noexcept

if (islower (str [0]))
werfen 'l';

Beachten Sie den Spezifizierer "NoExcept" direkt nach der richtigen Klammung der Funktionsparameterliste. Dies bedeutet, dass die Funktion keine Ausnahme ausgeben sollte. Wenn die Funktion eine Ausnahme ausgelöst hat, wird sie wie in diesem Fall mit einer Warnmeldung kompiliert, aber nicht ausgeführt. Ein Versuch, das Programm auszuführen.

Der NoExcept -Spezifizierer befindet sich in verschiedenen Formen. Diese sind wie folgt:

Typ func () noexcept; : lässt keinen Wurfausdruck zu
Typ func () noexcept (true); : Ermöglicht einen Wurfausdruck
Typ func () throw (); : lässt keinen Wurfausdruck zu
Geben Sie func () noexcept (false) ein; : Ermöglicht einen Wurfausdruck, der optional ist
Typ func (); : Ermöglicht einen Wurfausdruck, der optional ist

Richtig oder falsch in den Klammern kann durch einen Ausdruck ersetzt werden, der zu wahr oder falsch führt.

Die spezielle STD :: terminate () -Funktion:

Wenn eine Ausnahme nicht behandelt werden kann, sollte sie zurückgeworfen werden. In diesem Fall kann der geworfene Ausdruck einen Operanden haben oder nicht. Die spezielle Funktion STD :: terminate () wird zur Laufzeit aufgerufen, die das Programm anmutig anhalten sollte, anstatt nur zuzulassen, dass es buchstäblich zum Absturz kommt.

Geben Sie das folgende Programm ein, kompilieren Sie und führen Sie sie aus:

#enthalten
Verwenden von Namespace STD;
char input = '1';
int main ()

versuchen

if (isDigit (Eingabe))
10 werfen;

fangen (int)

Wurf;

Rückkehr 0;

Nach einer erfolgreichen Zusammenstellung beendete das Programm ohne Ausführen, und die Fehlermeldung vom Computer des Autors lautet:

„Beenden Sie nach dem Werfen einer Instanz von 'int' angerufen

Abgebrochen (Core Dumped) ”

Abschluss:

Die Ausnahmefunktion in C ++ verhindert, dass ein Codesegment basierend auf einer Eingabe ausführt. Das Programm führt weiterhin nach Bedarf aus. Das Ausnahmekonstrukt (Fehlerverhütung) besteht aus einem Try-Block und einem Fangblock. Der Try-Block verfügt über das Codessegment, das je nach Bedingung in der Eingabe umgangen werden kann, umgangen werden. Der Try-Block hat den Wurfausdruck, der einen Operand wirft. Dieser Operand wird auch als Ausnahme bezeichnet. Wenn der Operand -Typ und der Typ für den Parameter des Fangblocks gleich sind, wird die Ausnahme gefangen (behandelt). Wenn die Ausnahme nicht erfasst wird, wird das Programm beendet, aber dennoch sicher, da das Codesegment ausgeführt werden soll, um das falsche Ergebnis zu erzielen. Typische Ausnahmebehandlung bedeutet, das Codesegment zu umgehen und eine Fehlermeldung an den Benutzer zu senden. Das Codesegment wird für normale Eingaben ausgeführt, wird jedoch für falsche Eingaben umgangen.