try, throw, and catch Statements (C++) (try-, throw- und catch-Anweisungen (C++))

Um die Ausnahmebehandlung in C++ zu implementieren, verwenden trySie Ausdrücke throwund catch Ausdrücke.

Verwenden Sie zunächst einen try Block, um eine oder mehrere Anweisungen einzuschließen, die eine Ausnahme auslösen können.

Ein throw Ausdruck signalisiert, dass eine außergewöhnliche Bedingung – häufig ein Fehler – in einem try Block aufgetreten ist. Sie können ein Objekt eines beliebigen Typs als Operanden eines throw Ausdrucks verwenden. Normalerweise wird dieses Objekt verwendet, um Informationen über den Fehler zu kommunizieren. In den meisten Fällen wird empfohlen, die std::exception Klasse oder eine der abgeleiteten Klassen zu verwenden, die in der Standardbibliothek definiert sind. Wenn einer dieser Nicht geeignet ist, empfehlen wir, dass Sie Ihre eigene Ausnahmeklasse von std::exception.

Um Ausnahmen zu behandeln, die ausgelöst werden können, implementieren Sie einen oder catch mehrere Blöcke unmittelbar nach einem try Block. Jeder catch Block gibt den Typ der Ausnahme an, die er verarbeiten kann.

Dieses Beispiel zeigt einen try Block und seine Handler. Nehmen Sie an, dass GetNetworkResource() Daten über eine Netzwerkverbindung erhält und dass die beiden Ausnahmetypen benutzerdefinierte Klassen sind, die von std::exception abgeleitet sind. Beachten Sie, dass die Ausnahmen in der catch Anweisung durch const Verweis abgefangen werden. Es wird empfohlen, dass Sie die Ausnahmen nach Wert auslösen und sie durch einen const-Verweis abfangen.

Beispiel

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

Hinweise

Der Code nach der try Klausel ist der geschützte Codeabschnitt. Der throw Ausdruck löst eine Ausnahme aus , d. h. löst sie aus. Der Codeblock nach der catch Klausel ist der Ausnahmehandler. Dies ist der Handler, der die Ausnahme abfangen wird, die ausgelöst wird, wenn die Typen in den throw und catch Ausdrücken kompatibel sind. Eine Liste der Regeln, die den Typabgleich in catch Blöcken steuern, finden Sie unter "Bewerten von Catch-Blöcken". Wenn die catch Anweisung eine Auslassungspunkte (...) anstelle eines Typs angibt, behandelt der catch Block jeden Ausnahmetyp. Wenn Sie mit der /EHa Option kompilieren, können diese C-strukturierte Ausnahmen und vom System generierte oder vom Anwendung generierte asynchrone Ausnahmen wie Speicherschutz, Dividierung durch Null und Gleitkommaverletzungen enthalten. Da catch Blöcke im Programm verarbeitet werden, um einen übereinstimmenden Typ zu finden, muss ein Ellipsehandler der letzte Handler für den zugeordneten try Block sein. Verwenden Sie catch(...) mit Vorsicht. Lassen Sie es einem Programm nicht zu, den Vorgang fortzusetzen, es sei denn, der Catch-Block weiß, wie die spezifische Ausnahme behandelt wird, die abgefangen wird. Normalerweise wird ein catch(...)-Block verwendet, um Fehler zu protokollieren und eine spezielle Bereinigung vor dem Beenden der Programmausführung auszuführen.

Ein throw Ausdruck, der keine Operanden enthält, beschreibt die derzeit behandelte Ausnahme. Wir empfehlen dieses Formular beim Erneuten Drosseln der Ausnahme, da dadurch die polymorphen Typinformationen der ursprünglichen Ausnahme beibehalten werden. Ein solcher Ausdruck sollte nur in einem catch Handler oder in einer Funktion verwendet werden, die von einem catch Handler aufgerufen wird. Das rethrown exception-Objekt ist das ursprüngliche Ausnahmeobjekt, nicht eine Kopie.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

Siehe auch

Bewährte Methoden für moderne C++-Methoden für Ausnahmen und Fehlerbehandlung
Schlüsselwörter
Nicht behandelte C++-Ausnahmen
__uncaught_exception