Auswerten von Catch-Blöcken (C++)
C++ ermöglicht Ihnen das Auslösen von Ausnahmen eines beliebigen Typs, obwohl im Allgemeinen empfohlen wird, Typen auszulösen, die von der std::exception abgeleitet sind. Eine C++-Ausnahme kann von einem catch
Handler abgefangen werden, der denselben Typ wie die ausgelöste Ausnahme angibt, oder von einem Handler, der einen beliebigen Ausnahmetyp abfangen kann.
Wenn der Typ der ausgelösten Ausnahme eine Klasse ist, die auch eine Basisklasse (oder Klassen) besitzt, kann sie durch Handler abgefangen werden, die Basisklassen des Ausnahmetyps oder Verweise auf Basen des Ausnahmetyps akzeptieren. Beachten Sie, dass wenn eine Ausnahme durch einen Verweis abgefangen wird, sie an das tatsächlich ausgelöste Ausnahmeobjekt gebunden ist; andernfalls ist es eine Kopie (nahezu identisch mit einem Argument für eine Funktion).
Wenn eine Ausnahme ausgelöst wird, kann sie von den folgenden Typen von catch
Handlern abgefangen werden:
Ein Handler, der jeden Typ akzeptieren kann (mit der Auslassungszeichensyntax).
Ein Handler, der denselben Typ wie das Ausnahmeobjekt akzeptiert; da es sich um eine Kopie handelt und
const
volatile
Modifizierer ignoriert werden.Ein Handler, der einen Verweis auf den gleichen Typ wie das Ausnahmeobjekt akzeptiert.
Ein Handler, der einen Verweis auf ein
const
Odervolatile
Formular desselben Typs wie das Ausnahmeobjekt akzeptiert.Ein Handler, der eine Basisklasse desselben Typs wie das Ausnahmeobjekt akzeptiert; da es sich um eine Kopie handelt und
const
volatile
Modifizierer ignoriert werden. Dercatch
Handler für eine Basisklasse darf demcatch
Handler für die abgeleitete Klasse nicht vorangehen.Ein Handler, der einen Verweis auf eine Basisklasse des gleichen Typs wie das Ausnahmeobjekt akzeptiert.
Ein Handler, der einen Verweis auf eine
const
Odervolatile
Form einer Basisklasse desselben Typs wie das Ausnahmeobjekt akzeptiert.Ein Handler, der einen Zeiger akzeptiert, in den ein ausgelöstes Zeigerobjekt über Standardzeigerkonvertierungsregeln konvertiert werden kann.
Die Reihenfolge, in der catch
Handler angezeigt werden, ist wichtig, da Handler für einen bestimmten try
Block in der Reihenfolge ihrer Darstellung untersucht werden. Beispielsweise ist es einem Fehler, den Handler einer Basisklasse vor dem Handler einer abgeleiteten Klasse zu platzieren. Nachdem ein übereinstimmenden catch
Handler gefunden wurde, werden nachfolgende Handler nicht untersucht. Daher muss ein Ellipsehandler catch
der letzte Handler für seinen try
Block sein. Beispiel:
// ...
try
{
// ...
}
catch( ... )
{
// Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
// Handle CExcptClass exception here.
}
In diesem Beispiel ist der Ellipsehandler catch
der einzige Handler, der untersucht wird.
Siehe auch
Bewährte Methoden für moderne C++-Methoden für Ausnahmen und Fehlerbehandlung
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