Mieszanie wyjątków C (ustrukturyzowanych) i C++

Jeśli chcesz napisać kod przenośny, nie zaleca się używania ustrukturyzowanej obsługi wyjątków (SEH) w programie C++. Czasami jednak może być konieczne skompilowanie przy użyciu /EHa wyjątków ustrukturyzowanych i kodu źródłowego języka C++ oraz użycie pewnych funkcji do obsługi obu rodzajów wyjątków. Ponieważ ustrukturyzowana procedura obsługi wyjątków nie ma pojęcia obiektów ani wyjątków typizowanych, nie może obsługiwać wyjątków zgłaszanych przez kod C++. Jednak programy obsługi języka C++ catch mogą obsługiwać wyjątki ustrukturyzowane. Składnia obsługi wyjątków języka C++ (try, throw, catch) nie jest akceptowana przez kompilator języka C, ale składnia obsługi wyjątków strukturalnych (__try, __except, __finally) jest obsługiwana przez kompilator języka C++.

Zobacz _set_se_translator , aby uzyskać informacje na temat obsługi wyjątków strukturalnych jako wyjątków języka C++.

Jeśli mieszasz wyjątki ze strukturą i językiem C++, pamiętaj o tych potencjalnych problemach:

  • Wyjątki języka C++ i wyjątki ustrukturyzowane nie mogą być mieszane w ramach tej samej funkcji.

  • Procedury obsługi zakończenia (__finally bloki) są zawsze wykonywane, nawet podczas odwijania po wystąpieniu wyjątku.

  • Obsługa wyjątków języka C++ może przechwytywać i zachowywać semantyka odwijania we wszystkich modułach skompilowanych za /EH pomocą opcji kompilatora, które umożliwiają odwijanie semantyki.

  • Mogą wystąpić pewne sytuacje, w których funkcje destruktora nie są wywoływane dla wszystkich obiektów. Na przykład podczas próby wykonania wywołania funkcji za pomocą niezainicjowanego wskaźnika funkcji może wystąpić wyjątek ustrukturyzowany. Jeśli parametry funkcji są obiektami skonstruowanymi przed wywołaniem, destruktory tych obiektów nie są wywoływane podczas odwijania stosu.

Następne kroki

Zobacz też

Nowoczesne najlepsze rozwiązania dotyczące języka C++ dotyczące wyjątków i obsługi błędów