2011-07-19 13 views
6

Niedawno widziałem coś ciekawego w pewnym c:C++ "catch (...)" parametr

try { 
    //doStuff 
} catch (...) { 
    //doStuff 
} 

"..." jest to, co mam na myśli.

Teraz na pierwszy rzut oka można by pomyśleć, że to nic innego jak wypełniacz, jak komentarz podobny do "doStuff", który widzimy. Dziwne jest to, że wpisanie tego w Eclipse CDT faktycznie działa, bez podawania jakichkolwiek błędów składniowych.

Czy jest to w ogóle cel specjalny?

+0

Ta specjalna składnia została prawdopodobnie wybrana ze względu na jej podobieństwo do konwencji naturalnej angielszczyzny. –

Odpowiedz

6

Jak wspomnieli inni, wszystko przykuwa uwagę. Z tego, co widziałem, jest to najczęściej używane, gdy nie można zidentyfikować rzeczywistego wyjątku, który został zgłoszony. Może się to zdarzyć, jeśli wyjątek ten jest Structured Exception, który nie jest w C++. Na przykład, jeśli próbujesz uzyskać dostęp do nieprawidłowej lokalizacji w pamięci. Zwykle nie jest dobrym nawykiem używać tych "złapać wszystkie". Nie masz (przenośnego) sposobu na pobranie śladu stosu i nie wiesz nic o rzuconym wyjściu.

Używanie tego z powodów innych niż przykłady lub bardzo banalne przypadki może oznaczać, że autor próbuje ukryć niestabilność programu, nie dbając o nierozpoznane wyjątki. Jeśli kiedykolwiek spotkasz się z takim przypadkiem, lepiej pozwól na awarię programu i utwórz zrzut awaryjny, który możesz później przeanalizować. Lub użyj structured exception handler (w przypadku, gdy korzystasz z VS - nie wiesz jak to zrobić na innych kompilatorach).

3

To "catch ellipsis", co oznacza "złapać wszystkie wyjątki, które zostały rzucone i obsłużyć je tutaj". W przeciwieństwie do catch(SpecificType), który przechwytywałby tylko wyjątki pewnych typów, catch(...) przechwytywałoby wszystkie wyjątki C++.

+1

Poza tym nie ma sposobu na uzyskanie rzeczywistego obiektu wyjątku. :-( –

+4

@Chris, rzeczywiście jest sposób ... możesz go ponownie rzucić i złapać ponownie.Jest nie brzmi użytecznie, ale pozwala na przeniesienie typowej obsługi wyjątków do oddzielnej funkcji. 'Try {something()} catch (...) {handle_errors();} 'Następnie' void handle_errors() {try {throw} catch (MyErrorA &) {// to A} catch (MyErrorB &) {// to B} // Inaczej robi się rethown dla kogoś, kto złapie} '. –

+0

@Michael: Fancy! +1 –

6

Jest to catch All.
Spowoduje to wychwycenie dowolnego typu wyjątku.
Podczas korzystania z niego Upewnij się, że jest on umieszczony na końcu wszystkich programów obsługi przechwytywania lub po prostu wychwyci wszystkie wyjątki niezależnie od typu.

1

Jeśli istnieją pewne wyjątki, które mogą zostać zwrócone z bloku try, o czym być może nie wiesz lub czego nie chcesz specjalnie traktować, możesz umieścić ten kod. Spowoduje to wychwycenie wszystkich wyjątków.