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 constvolatile Modifizierer ignoriert werden.

  • Ein Handler, der einen Verweis auf den gleichen Typ wie das Ausnahmeobjekt akzeptiert.

  • Ein Handler, der einen Verweis auf ein const Oder volatile 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 constvolatile Modifizierer ignoriert werden. Der catch Handler für eine Basisklasse darf dem catch 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 Oder volatile 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