RAII a wyjątki

Im więcej używamy RAII w C ++, tym bardziej znajdujemy destruktory, które wykonują nietrywialną deallocation. Teraz deallocation (finalizacja, jakkolwiek chcesz to nazwać) może się nie powieść, w takim przypadku wyjątki są naprawdę jedynym sposobem, aby powiadomić kogoś na górze o naszym problemie ze zwolnieniem. Ale z drugiej strony, destruktory rzucania są złym pomysłem z powodu możliwości wyrzucania wyjątków podczas rozwijania stosu.std::uncaught_exception() pozwala wiedzieć, kiedy to się dzieje, ale niewiele więcej, więc pomijając rejestrowanie wiadomości przed zakończeniem, niewiele możesz zrobić, chyba że chcesz zostawić swój program w niezdefiniowanym stanie, w którym niektóre rzeczy są zwolnione / sfinalizowane a niektóre nie.

Jednym z podejść jest posiadanie destruktorów bez rzutu. Ale w wielu przypadkach po prostu ukrywa prawdziwy błąd. Nasz destruktor może na przykład zamykać niektóre połączenia DB zarządzane przez RAII w wyniku wyjątku, który może zostać zgłoszony, a połączenia DB mogą się nie zamknąć. Nie musi to oznaczać, że wszystko jest w porządku z zakończeniem programu w tym momencie. Z drugiej strony rejestrowanie i śledzenie tych błędów nie jest rozwiązaniem dla każdego przypadku; w przeciwnym razie nie potrzebowalibyśmy wyjątków. W przypadku destruktorów bez rzutu musimy także tworzyć funkcje „reset ()”, które powinny być nazywane przed zniszczeniem - ale to po prostu pokonuje cały cel RAII.

Innym podejściem jest po prostupozwól programowi się zakończyć, ponieważ jest to najbardziej przewidywalna rzecz, jaką możesz zrobić.

Niektórzy sugerują łączenie wyjątków, dzięki czemu jednocześnie można obsługiwać więcej niż jeden błąd. Ale naprawdę nigdy nie widziałem tego w C ++ i nie mam pojęcia, jak zaimplementować coś takiego.

Więc to albo RAII, albo wyjątki. Czyż nie? Skłaniam się ku destruktorom bez rzutu; głównie dlatego, że utrzymuje rzeczy proste (r). Ale naprawdę mam nadzieję, że istnieje lepsze rozwiązanie, ponieważ, jak już powiedziałem, im więcej korzystamy z RAII, tym bardziej korzystamy z narzędzi, które robią rzeczy nietrywialne.

dodatek

Dodaję linki do interesujących artykułów i dyskusji, które znalazłem:

Destruktory do rzucaniaDyskusja StackOverflow na tematproblemy z SEHDyskusja StackOverflow na tematniszczyciele-miotacze (dzięki, Martin York)Joel o wyjątkachSEH uważany za szkodliwyObsługa wyjątków CLR który dotyka także łańcuchów wyjątkowychHerb Sutter na std :: uncaught_exception i dlaczego nie jest tak użyteczny, jak myśliszDyskusja historyczna w tej sprawie z ciekawymi uczestnikami (długo!)Stroustrup wyjaśniaRAIIAndrei Alexandrescu'sStrażnik zakresu

questionAnswers(7)

yourAnswerToTheQuestion