Powinieneś użyć bloku try
/catch
.
Tak jak inni już odpowiedzieli, __try
/__except
służy do przechwytywania SEH (błędy generowane przez okno), a nie do przechwytywania ogólnych wyjątków.
Co najważniejsze, __try
i __catch
nie mogą uruchamiać destruktorów języka C++ ani poprawnie rozwijać stosu podczas zgłaszania wyjątku.
Z wyjątkiem rzadkich przypadków, nigdy nie należy próbować łapać wyjątków SEH.
EDIT: Cóż, była pozytywna na to (to co ja zawsze mówiono), ale mówi, że widocznie @Hans jest przełącznik kompilator można użyć, aby to zmienić. Myślę, że dokumenty na temat /EHa
są mylące, a przynajmniej niekompletne, na temat tego, co się tutaj dzieje. Jeśli ktoś znajdzie ostateczne dokumenty, które okażą się błędne, z przyjemnością usunę tę odpowiedź.
Nawet jeśli okaże się, to jest fałszywy, należy nadal używać try
i catch
po prostu dlatego, że są standardowe, natomiast __try
i __except
nie są.
Więc nie rozwija się stos? Oznacza to, że prawdopodobnie złym pomysłem jest użycie '__try' /' __except' jako czegoś innego niż system zgłaszania awarii, podczas gdy często można odzyskać dane z wyjątku w bloku 'try' /' catch'. –
@David: Zgadza się. '__try' i' __except' to stricte oparte na C API/ABI. –
Jedyne dobre zastosowania dla tego, co widziałem, zajmowały się tym, co stanowiło błędy w samym systemie Windows (takie jak to, co działo się, gdy próbowano skopiować urządzenie). Prawdopodobnie zawsze wskazują gdzieś, gdzie system Windows powinien przechwycić wyjątek i przetłumaczyć go na błąd. (Sposób, w jaki działają, jest również przerażający i bardzo specyficzny dla x86 ...) –