2009-09-11 11 views
13

Zacząłem używać wyjątków C++ w jednolity sposób, a teraz chciałbym, aby kompilator (g ++) sprawdził, czy nie ma "nieszczelności wyjątków". Dekoracja throw powinna to zrobić, podobnie jak w przypadku metod klasowych, takich jak const.Czy jest jakiś użytek do dekoracji rzutów w C++?

Cóż, nie ma.

Używanie jest nadal dokumentem, ale może nawet być niebezpiecznie mylące, jeśli inni uważają, że funkcja nie może wyrzucać innych wyjątków niż te wymienione w dokumentacji.

Czy g ++ może być w jakiś sposób przekonany, aby być bardziej rygorystycznym w sprawdzaniu rzucania, tzn. Upewniając się, że funkcja udekorowana jako throw() nigdy niczego nie rzuci.

Edytuj: Znaleziono this question szeroko obsługujący ten temat.

+0

Podobne pytanie tutaj: http://stackoverflow.com/questions/1037575/why-arent-exceptions-in-c-checked-by-the-compiler – Glen

Odpowiedz

15

Nie sprawdza kompilacji, ale zgodny kompilator powinien zapewnić to w czasie wykonywania.

Jeśli funkcja wyrzuci cokolwiek poza deklaracją rzutowania, czas działania C++ powinien wywołać std :: nieoczekiwany, o ile dobrze pamiętam.

+0

to moja zrozumienie też. Dlaczego chcesz to zrobić, nie mam pojęcia. Osobiście uważam, że 'GetFoo() // throws (std :: runtime_error)' jest znacznie bardziej użyteczne niż niecenzuralny odpowiednik - tak jak podpowiedź dla konsumentów mojego kodu. –

+1

Prawidłowo. Praktycznym problemem podczas sprawdzania kompilacji jest to, że większość istniejącego kodu C++ nie ma specyfikacji rzutowania. – MSalters

+8

Program Visual C++ 2008 nie obsługuje tej części standardu. –

0

Nie wiem, czy narzędzie sprawdzania/kompilator może to zrobić. Być może łatwiej jest to skomentować w deklaracji funkcji. Cóż, nie jest to dowód na głupotę, ale jeśli ludzie widzą, że może być wyjątek rzucony, większość ludzi będzie owijała wywołanie funkcji próbując i łapiąc.

//Can throw Exception 
GetFoo(); 
2

Zasadniczo specyfikacje wyjątków są dobre tylko jako puste specyfikacje wyjątków. W przeciwnym razie myślę, że to eksperyment, który się nie powiódł. Zobacz, dlaczego: phlipsy's answer.

8

Polecam również przejrzeć this esej na temat specyfikacji wyjątków. To wskazuje na problemy tego C++ funkcji jak:

  • Jest to system typu shadow
  • Kontrole kompilatora rzucony wyjątek tylko przy starcie
  • uruchomionych domyślne zachowanie w przypadku rzucony ale nie podano wyjątkiem jest zwykle bezużyteczne i często źle rozumiane przez programistów
Powiązane problemy