Wie Catch-Blöcke ausgewertet werden (C++)
C++ ermöglicht Ihnen das Auslösen von Ausnahmen eines beliebigen Typs im Allgemeinen, obwohl empfohlen wird, um Typen auszulösen, die von std: abgeleitet sind: Ausnahme.Ein C++-Compiler Ausnahme kann von einem catch-Handler, der denselben Typ wie die ausgelöste Ausnahme angegeben wird oder aus einem Handler abgefangen werden, der jeden Typ von Ausnahme abfangen kann.
Wenn der Typ der ausgelösten Ausnahme eine Klasse ist, die auch eine Basisklasse (oder Klassen) verfügt, kann sie durch einen Handler, die Basisklassen des Typs akzeptiert der Ausnahme sowie Verweise auf die Basisschnittstellen vom Typ der Ausnahme abgefangen werden.Beachten Sie, dass, wenn eine Ausnahme durch einen Verweis abgefangen wird, er dem tatsächlichen ausgelösten Ausnahmeobjekt gebunden ist. Andernfalls ist es eine Kopie (identisch mit vielen ein Argument für eine Funktion.)
Wenn eine Ausnahme ausgelöst wird, wird sie durch die folgenden Typen von catch-Handlern abgefangen werden:
Ein Handler, der jeden Typ akzeptieren kann mit den Auslassungszeichen (Syntax).
Ein Handler, der den gleichen Typ wie das Ausnahmeobjekt akzeptiert. da es eine Kopie ist, werden const und volatile-Modifizierer ignoriert.
Ein Handler, der einen Verweis auf den gleichen Typ wie das Ausnahmeobjekt akzeptiert.
Ein Handler, der einen Verweis auf ein const oder volatile Form von akzeptiert, die als geben genau ein Ausnahmeobjekt.
Ein Handler, der eine Basisklasse gleiche Typ wie das Ausnahmeobjekt akzeptiert. da es eine Kopie ist, werden const und volatile-Modifizierer ignoriert.Der catch-Handler muss eine Basisklasse für den catch-Handler für die abgeleitete Klasse nicht stehen.
Ein Handler, der einen Verweis auf einer Basisklasse gleiche Typ wie das Ausnahmeobjekt akzeptiert.
Ein Handler, der einen Verweis auf ein constvolatile Formular oder von einer Basisklasse gleich akzeptiert, geben als das Ausnahmeobjekt ein.
Ein Handler, der einen Zeiger akzeptiert, zu dem ein Zeiger ausgelöstes Objekt konvertierungs Zeiger über die Regeln konvertiert werden kann.
Die Reihenfolge, in der catch-Handler angezeigt werden, ist wichtig, da Handler für einen angegebenen try-Block in der Reihenfolge ihrer Darstellung überprüft werden.Beispielsweise ist es zu einem Fehler, für die der Handler eine Basisklasse vor dem Handler für eine abgeleitete Klasse zu platzieren.Nachdem ein entsprechender catch-Handler gefunden wird, werden nachfolgende Handler nicht überprüft.Daher muss ein Auslassungszeichen catch-handler der letzte Handler für den try-Block sein.Beispiele:
// ...
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 mit den Auslassungspunkten catch-handler der einzige Handler, der überprüft wird.