Ausnahmen: Abfangen und Löschen von Ausnahmen
In den folgenden Anweisungen und Beispielen wird gezeigt, wie Ausnahmen erfasst und gelöscht werden. Weitere Informationen zu den , und Schlüsselwort (keyword)s finden Sie unter Modern C++ bewährte Methoden für Ausnahmen und Fehlerbehandlung.throw
catch
try
Ihre Ausnahmehandler müssen Ausnahmeobjekte löschen, die behandelt werden, da beim Löschen der Ausnahme ein Speicherverlust auftritt, wenn dieser Code eine Ausnahme abfangen kann.
Ihr catch
Block muss eine Ausnahme löschen, wenn:
Der
catch
Block löst eine neue Ausnahme aus.Natürlich dürfen Sie die Ausnahme nicht löschen, wenn Sie dieselbe Ausnahme erneut auslösen:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
Die Ausführung wird aus dem
catch
Block zurückgegeben.
Hinweis
Verwenden Sie beim Löschen eines Elements CException
die Delete
Memberfunktion, um die Ausnahme zu löschen. Verwenden Sie die delete
Schlüsselwort (keyword) nicht, da sie fehlschlagen kann, wenn sich die Ausnahme nicht auf dem Heap befindet.
So erfassen und löschen Sie Ausnahmen
Verwenden Sie die
try
Schlüsselwort (keyword), um einentry
Block einzurichten. Führen Sie alle Programmanweisungen aus, die eine Ausnahme innerhalb einestry
Blocks auslösen können.Verwenden Sie die
catch
Schlüsselwort (keyword), um einencatch
Block einzurichten. Platzieren Sie Ausnahmebehandlungscode in einemcatch
Block. Der Code imcatch
Block wird nur ausgeführt, wenn der Code innerhalb destry
Blocks eine Ausnahme des in dercatch
Anweisung angegebenen Typs auslöst.Die folgende Skelett zeigt, wie
try
undcatch
Blöcke normalerweise angeordnet sind:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
Wenn eine Ausnahme ausgelöst wird, wird das Steuerelement an den ersten
catch
Block übergeben, dessen Ausnahmedeklaration mit dem Typ der Ausnahme übereinstimmt. Sie können verschiedene Arten von Ausnahmen selektiv mit sequenziellencatch
Blöcken behandeln, wie unten aufgeführt:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
Weitere Informationen finden Sie unter Ausnahmen: Konvertieren von MFC-Ausnahmemakros.