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

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

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

Ein throw Ausdruck signalisiert, dass häufig ein Ausnahmezustand in einem —— -Block aufgetreten try 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 eine dieser Klassen nicht geeignet ist, empfiehlt es sich, eine eigene Ausnahmeklasse von std::exception abzuleiten.

Um Ausnahmen zu behandeln, die ausgelöst werden können, implementieren Sie einen oder mehrere catch Blöcke unmittelbar nach einem try -Block. 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 als Verweis in der -Anweisung abgefangen constcatch 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");
   // ...
}

Bemerkungen

Der Code nach der try -Klausel ist der überwachte Codeabschnitt. Der throw Ausdruck throw— d.h. löst — eine Ausnahme aus. Der Codeblock nach der catch -Klausel ist der Ausnahmehandler. Dies ist der Handler, der die Ausnahme abfängt, die ausgelöst wird, wenn die Typen in den Ausdrücken und kompatibel catch sind. Eine Liste der Regeln, die den Typabgleich in catch -Blöcken steuern, finden Sie unter How Catch Blocks are Evaluated ( Auswerten von catch Wenn die catch -Anweisung eine Auslassungspunkte (...) anstelle eines Typs angibt, verarbeitet der catch -Block jeden Ausnahmetyp. Wenn Sie mit der Option /EHa kompilieren, können dies strukturierte C-Ausnahmen und vom System generierte oder anwendungsgenerierte asynchrone Ausnahmen wie Speicherschutz, Division durch Null und Gleitkommaverletzungen umfassen. Da catch Blöcke in Programmreihenfolge verarbeitet werden, um einen übereinstimmenden Typ zu finden, muss ein Auslassungszeichenhandler 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, der über keinen Operanden verfügt, löst die ausnahme, die gerade behandelt wird, erneut aus. Es wird empfohlen, dieses Formular beim erneuten Auslösen der Ausnahme zu verwenden, da dadurch die polymorphen Typinformationen der ursprünglichen Ausnahme beibehalten ’ werden. Ein solcher Ausdruck sollte nur in einem Handler oder in einer Funktion verwendet catch werden, die von einem Handler aufgerufen catch 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;
}

Weitere Informationen

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