Moja duża aplikacja posiada tę strukturę:Jak złapać wyjątki warunkowo?
int main()
{
try {
...
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
return 1;
}
}
głębi stosu wywołań, różne obiekty sprawdzić ich stan wewnętrzny, rzucając std::runtime_exception
jeśli wykryją coś złego. Obsługiwana jest obsługa wyjątków typu all-inclusive, wypisuje niektóre umiarkowanie użyteczne informacje i kończy działanie programu.
Jednak podczas debugowania w MS Visual Studio, mogłem czerpać korzyści z braku obsługi wyjątków: Visual Studio ma swój własny, bardzo przydatny handler, który zatrzymuje moją aplikację w miejscu, w którym wyjątek został zgłoszony, więc Mogę sprawdzić, co poszło nie tak.
Jak mogę zrobić połowu moich wyjątkami warunkowo?
Próbowałem następujące:
try {
...
} catch (std::exception& e) {
if (IsDebuggerPresent())
throw;
else
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
Dało to dziwny wynik: Visual Studio złapać wyjątek, który został rethrown i pokazał mi ślad stosu w miejscu, gdzie wyjątek. Jednak wszystkie obiekty w mojej aplikacji zostały najwyraźniej zniszczone i nie mogłem zobaczyć np. zmienne lokalne lub członkowskie.
mógłbym zrobić wyjątek obsługi uwarunkowane flagi kompilacji:
#ifdef NDEBUG
try {
#endif
...
#ifdef NDEBUG
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
#endif
ale to jest niewygodne, bo muszę skompilować wszystko, jeśli chcę go debugowania.
Tak, jak mogę uczynić wyjątek obsługi moja warunkowy (w zależności od argumentu wiersza poleceń, na przykład)?
Spróbuj 'Debug' ->' Exceptions' i zaznaczyć pole „Przerwa na rzut” za wyjątkiem (ów), które chcesz łapać. – CompuChip
Lepszą metodą byłoby * warunkowo * rzucić wyjątek, którego twoi trenerzy po prostu nie mogą złapać (przez poziom pośredni), pozostawiając go do debuggera, by je porwać. –
Jeśli metoda @ CompuChip działa dla Ciebie, zdecydowanie lepiej z tych dwóch. – TonyK