Nie wiem, czy istnieje teoria, ale może pojawić się pragmatyczna nauka eksperymentalna.
Najlepszym źródłem, o jakim mogę myśleć, jest Bjarne Stroustrup, The Design and Evolution of C ++, Addison-Wesley, 1994 . Jeśli dobrze pamiętam (jest to bardzo dobra książka, a ludzie pożyczają ją ode mnie i nie zwracają, więc nie mam jej w tej chwili), jest rozdział o wyjątkach. Komitet C ++ pod przewodnictwem Stroustrupa wymagał wielu dowodów empirycznych, że proponowana funkcja była konieczna, zanim byli gotowi dodać ją do definicji języka. Strona Wikipedii o wyjątkach zawiera następujący cytat z tej książki:
Na spotkaniu Palo Alto [C ++] w listopadzie 1991 r. Usłyszeliśmy genialne podsumowanie argumentów za semantyką terminacji popartą zarówno osobistym doświadczeniem, jak i danymi Jima Mitchella (z firmy Sun, wcześniej z Xerox PARC). Jim korzystał z obsługi wyjątków w pół tuzinie języków przez okres 20 lat i był jednym z pierwszych zwolenników semantyki wznawiania jako jeden z głównych projektantów i wdrażaczy systemu Cedar / Mesa firmy Xerox. Jego przesłanie było takie, że zakończenie jest lepsze niż wznowienie; nie jest to kwestia opinii, ale kwestia wieloletniego doświadczenia. Wznowienie jest uwodzicielskie, ale nieważne. Poparł to oświadczenie doświadczeniem z kilku systemów operacyjnych. Kluczowym przykładem był Cedar / Mesa: został napisany przez ludzi, którzy lubili i korzystali z wznowienia, ale po dziesięciu latach użytkowania, zostało tylko jedno użycie wznowienia w systemie pół miliona linii - i było to badanie kontekstowe. Ponieważ wznowienie nie było tak naprawdę konieczne dla takiego zapytania kontekstowego, usunęli go i stwierdzili znaczny wzrost prędkości w tej części systemu. W każdym przypadku, w którym zastosowano wznowienie, na przestrzeni dziesięciu lat stanowiło problem, a bardziej odpowiedni projekt go zastąpił. Zasadniczo każde użycie wznowienia oznaczało brak zachowania odrębnych poziomów abstrakcji. W każdym przypadku, w którym zastosowano wznowienie, na przestrzeni dziesięciu lat stanowiło problem, a bardziej odpowiedni projekt go zastąpił. Zasadniczo każde użycie wznowienia oznaczało brak zachowania odrębnych poziomów abstrakcji. W każdym przypadku, w którym zastosowano wznowienie, na przestrzeni dziesięciu lat stanowiło problem, a bardziej odpowiedni projekt go zastąpił. Zasadniczo każde użycie wznowienia oznaczało brak zachowania odrębnych poziomów abstrakcji.
W C ++ prawdziwą wygraną jest RAII , co znacznie ułatwia obsługę dealokacji zasobów podczas błędów. (To nie eliminuje potrzeby throw
i try
- catch
, ale oznacza, że nie potrzebujesz finally
).
Myślę, że rzeczą, która przekonała ich, że potrzebują wyjątków, są ogólne kontenery: pisarz kontenerów nie wie nic o rodzajach błędów, które mogą zawierać zwrócone obiekty (a tym bardziej o tym, jak sobie z nimi poradzić), ale o kodzie, który wstawił te obiekty do kontener musi wiedzieć coś o interfejsie tych obiektów. Ale ponieważ nic nie wiemy o tym, jakie rodzaje błędów mogą generować zawarte w nim obiekty, nie możemy ustandaryzować typów wyjątków. (Przeciwnie: jeśli moglibyśmy standaryzować typy wyjątków, nie potrzebowalibyśmy wyjątków).
Inną rzeczą, której ludzie nauczyli się przez lata, jest to, że specyfikacje wyjątków są trudne do poprawnego przetłumaczenia na język. Zobacz na przykład: http://www.gotw.ca/publications/mill22.htm lub ten: http://www.gotw.ca/gotw/082.htm . (I to nie tylko C ++, programiści Java mają również długie argumenty na temat swoich doświadczeń ze sprawdzonymi i niesprawdzonymi wyjątkami ).
Trochę o historii wyjątków. Klasyczny artykuł to: John B. Goodenough: „Obsługa wyjątków: problemy i proponowana notacja”, Commun. ACM 18 (12): 683–696, 1975. Ale wcześniej znane były wyjątki. Mesa miał je około 1974 r., A PL / I też mogłem je mieć. Ada miała mechanizm wyjątków przed 1980 r. Uważam, że na wyjątki w C ++ największy wpływ miało doświadczenie z językiem programowania CLU Barbary Liskov od około 1976 r. Barbara Liskov: „Historia CLU” w Historii języków programowania --- II , Thomas J. Bergin, Jr. i Richard G. Gibson, Jr. (red.). str. 471-510, ACM, 1996 .