Mischen von C (strukturiert) und C++-Ausnahmen

Wenn Sie portablen Code schreiben möchten, wird die Verwendung der strukturierten Ausnahmebehandlung (SEH) in einem C++-Programm nicht empfohlen. Es kann jedoch vorkommen, dass Sie strukturierte /EHa Ausnahmen und C++-Quellcode kompilieren und kombinieren möchten und eine Möglichkeit für die Behandlung beider Arten von Ausnahmen benötigen. Da ein strukturierter Ausnahmehandler kein Konzept von Objekten oder typierten Ausnahmen aufweist, kann er keine vom C++-Code ausgelösten Ausnahmen behandeln. C++ catch -Handler können jedoch strukturierte Ausnahmen behandeln. C++-Ausnahmebehandlungssyntax (try, throw, catch) wird vom C-Compiler nicht akzeptiert, aber die Syntax für die strukturierte Ausnahmebehandlung (__try, __except, __finally) wird vom C++-Compiler unterstützt.

Informationen zum Behandeln von strukturierten Ausnahmen als C++-Ausnahmen finden Sie unter .See _set_se_translator for information on how to handle structured exceptions as C++exceptions.

Wenn Sie strukturierte und C++-Ausnahmen kombinieren, beachten Sie diese potenziellen Probleme:

  • C++-Ausnahmen und strukturierte Ausnahmen können nicht innerhalb derselben Funktion gemischt werden.

  • Beendigungshandler (__finally Blöcke) werden immer ausgeführt, auch während des Abbruchs nach dem Auslösen einer Ausnahme.

  • Die C++-Ausnahmebehandlung kann die Abspannsemantik in allen Modulen erfassen und beibehalten, die mit den /EH Compileroptionen kompiliert wurden, wodurch die Semantik entspannt werden kann.

  • Es kann situationen geben, in denen Destruktorfunktionen nicht für alle Objekte aufgerufen werden. Eine strukturierte Ausnahme kann z. B. auftreten, wenn Sie versuchen, einen Funktionsaufruf über einen nicht initialisierten Funktionszeiger zu tätigen. Wenn es sich bei den Funktionsparametern um Objekte handelt, die vor dem Aufruf erstellt werden, werden die Destruktoren dieser Objekte während des Stapels nicht aufgerufen.

Nächste Schritte

Siehe auch

Bewährte Methoden für moderne C++-Methoden für Ausnahmen und Fehlerbehandlung