Freigeben über


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

Um die Ausnahmebehandlung in C++ zu implementieren, verwenden Sie die Ausdrücke try, throw und catch.

Verwenden Sie zuerst einen try-Block, um eine oder mehrere Anweisungen zu umschließen, die eventuell eine Ausnahme auslösen.

Ein throw-Ausdruck signalisiert, dass ein Ausnahmezustand – oftmals ein Fehler – in einem try-Block aufgetreten ist. Sie können ein Objekt beliebigen Typs als Operand eines throw-Ausdrucks verwenden. Normalerweise wird dieses Objekt verwendet, um Informationen über den Fehler zu kommunizieren. In den meisten Fällen wird empfohlen, dass Sie die Klasse std::exception oder eine der abgeleiteten Klassen verwenden, die in der Standardbibliothek definiert sind. Wenn eine davon nicht passend ist, wird empfohlen, dass Sie Ihre eigene Ausnahmeklasse von std::exception ableiten.

Um Ausnahmen zu behandeln, die möglicherweise ausgelöst werden, implementieren Sie einen oder mehrere catch-Blöcke, die unmittelbar einem try-Block folgen. Jeder catch-Block gibt den Ausnahmetyp an, den er behandeln 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 durch den const-Verweis in der catch-Anweisung auftreten. 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 abgesicherte Codeabschnitt. Der throw-Ausdruck löst eine Ausnahme aus. Der Codeblock nach der catch-Klausel ist der Ausnahmehandler. Das ist der Handler, der die Ausnahme abfängt, die ausgelöst wird, wenn die Typen in den Ausdrücken throw und catch kompatibel sind. Eine Liste von Regeln, die Typenzuordnung in catch-Blöcken steuern, finden Sie unter Auswerten von Catch-Blöcken (C++). Wenn die catch-Anweisung ein Auslassungszeichen (...) statt eines Typs festlegt, behandelt der catch-Block jeden Ausnahmetyp. Wenn Sie mit der Option /EHa kompilieren, können diese Ausnahmen mit C-Struktur und vom System oder der Anwendung generierte asynchrone Ausnahmen umfassen, wie Speicherschutz, einer Division durch null und Fließkommaverletzungen. Da catch-Blöcke in der Programmabfolge verarbeitet werden, um einen übereinstimmenden Typ zu finden, muss ein Auslassungshandler der letzte Handler für den zugeordneten try-Block sein. Verwenden Sie catch(...) mit Vorsicht. Lassen Sie nicht zu, dass ein Programm fortgesetzt wird, es sei denn der catch-Block kann die spezifische Ausnahme, die abgefangen wird, behandeln. 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 ohne Operanden löst erneut die Ausnahme aus, die gerade verarbeitet wird. Wir empfehlen diese Form, wenn die Ausnahme erneut ausgelöst wird, denn dadurch wird die originale polymorphe Typinformation der Ausnahme bewahrt. Ein solcher Ausdruck sollte nur in einem catch-Handler oder in einer Funktion verwendet werden, die von einem catch-Handler aus aufgerufen wird. Das erneut ausgelöste Ausnahmeobjekt ist das ursprüngliche Ausnahmeobjekt (keine 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

Referenz

C++-Ausnahmebehandlung

C++-Schlüsselwörter

Nicht behandelte C++-Ausnahmen

__uncaught_exception