try, throw, and catch Statements (C++) (try-, throw- und catch-Anweisungen (C++))
Um die Ausnahmebehandlung in C++ zu implementieren, verwenden try
Sie Ausdrücke throw
und 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für