2010-03-23 14 views
14

Wiem, że ta funkcja będzie uznana za przestarzałą w C++ 0x, ale dla mnie jako nowicjusza totalnego wydaje się to dobrym pomysłem. Czy ktoś mógłby mi wytłumaczyć, dlaczego nie jest to dobry pomysł?Specyfikacja wyjątku

+0

Zobacz http://stackoverflow.com/editing-help i http://stackoverflow.com/faq. To nie jest forum. –

+4

@ John Saunders: jest to otwarte, ale uzasadnione pytanie techniczne. Istnieją powody, dla których funkcja jest usuwana ze standardu C++ i można je wytłumaczyć bez subiektywności i argumentacji. –

+0

@ Jonathan: dlaczego ty to reżyserujesz? –

Odpowiedz

10

Zobacz szczegółowy artykuł autorstwa Herb Sutter. Ma najdokładniejsze wyjaśnienie problemów i niedociągnięć ich projektu.

pragmatyczne spojrzenie na Specificiations wyjątków

+1

"Oto wiele osób uważa, że ​​specyfikacje wyjątków: - Gwarantują, że funkcje będą wyświetlać tylko wyszczególnione wyjątki (być może brak)." Czysty nonsens. To ** dokładnie ** to, co robią. "_Włącz optymalizacje kompilatora na podstawie wiedzy, że wylistowane zostaną tylko wyjątki (być może żadne)." To, co mogą zrobić specyfikacje wyjątku, a niektóre główne kompilatory ** faktycznie ** to robią. – curiousguy

+0

@curiousguy Czy przeczytałeś cały artykuł? Na podstawie Twojego komentarza brzmi to tak, jakbyś przestał po tym zdaniu. – JaredPar

+1

Nie mogę uwierzyć, że C++ 0x było już w toku w 2002 roku. Nadszedł czas! –

-2

przeglądu http://www.gotw.ca/publications/mill22.htm

First Issue: a „Shadow Type System”

Prawdziwy, pomniejszy punkt techniczny i łatwy do naprawienia.

Wydanie II (Mis) rozumienie

Oto, co wielu ludzi myśli, że specyfikacje wyjątek zrobić:

Jego pierwszy punkt:

  • gwarancję, że funkcje będą wyświetlać tylko wyszczególnione wyjątki (być może żadne).

Jeśli to jest to, co ludzie myślą, że to bardzo dobrze, bo to jest dokładnie to, co gwarancja ES, definicji. Herb zgadza w tym samym dokumencie:

(ES) egzekwowania przy starcie że funkcje rzuci tylko wymienione wyjątki (ewentualnie brak).

Jego drugi punkt:

  • Włącz optymalizacje kompilatora w oparciu o wiedzę, że tylko wymienione wyjątki (ewentualnie brak) zostanie wyrzucony.

Jest to absolutnie poprawne.

Wyjaśnia, dlaczego ten drugi punkt jest błędna wiara na przykładzie:

// Example 1(b) reprise, and two 
// potential white lies: 
// 
int Gunc() throw(); // will throw nothing (?) 

int Hunc() throw(A,B); // can only throw A or B (?) 

Czy komentarze są prawidłowe? Nie do końca. Gunc() może coś rzucić, a Hunc() może rzucić coś innego niż A lub B! Kompilator po prostu gwarantuje pokonanie ich bez sensu, jeśli robią ... oh, i przez większość czasu też pokonują twój program bez sensu.

Ponieważ Gunc() lub Hunc() może rzeczywiście rzucić coś, co obiecał, że nie, nie tylko nie może zakładać, że kompilator nie będzie stało (...)

Herb ostatnia uwaga, że ​​" (ES) Wymuś w czasie wykonywania, że ​​funkcje rzucają tylko wyszczególnione wyjątki (być może żadne). "" Odrzuć ten "argument" też.

Zarówno główne 2 punkty Herb'a są oczywiście bezwzględnie, bezdyskusyjnie błędne, według niego.

Co jeszcze mogę dodać?

Wierzę, że słowa mają znaczenie, które nie mogą być zmienione w dowolnym momencie, ze względu na "argument".

+0

Czy ktoś może odrzucić dowolny punkt, który robię? Czy też jestem zarzucany za sprzeczność z pół-Boginią Herb Sutter? – curiousguy

+5

Lepsze pytanie: Czy potrafisz * udowodnić * swoje punkty? Po prostu mówisz "to jest tak, kropka", co nie jest zbyt przekonujące. Nie ma nic złego w sprzeczności z kimś. "Oba główne punkty Herba 2 są oczywiście absolutnie bezdyskusyjnie błędne". Załóżmy, że nie jest to dla mnie tak oczywiste, jak dla ciebie. Chcesz wyjaśnić, co jest tak oczywiste? – Xeo

+0

@Xeo Który punkt nie jest oczywisty? – curiousguy

0

O ile dobrze rozumiem, specyfikacja wyjątek oznacza:

ja wa ty (kompilator), aby wygenerować dodatkowy kod, który zapewnia, że ​​wyjątkiem jest jeden z tych typów. Jeśli nie zadzwonisz, proszę, wznosimy toast. Dodatkowe sprawdzanie należy umieścić w (niejawnym) procederze obsługi wyjątku (wymaganym do implementacji) w każdym wywołaniu.

Powiązane problemy