Używanie exit()jest OK
Dwa główne aspekty projektowania kodu, o których jeszcze nie wspomniano, to „wątkowanie” i „biblioteki”.
W programie jednowątkowym, w kodzie, który piszesz w celu zaimplementowania tego programu, użycie exit()jest w porządku. Moje programy używają go rutynowo, gdy coś poszło nie tak i kod nie zostanie odzyskany.
Ale…
Jednak wezwanie exit()jest działaniem jednostronnym, którego nie można cofnąć. Dlatego zarówno „wątkowanie”, jak i „biblioteki” wymagają dokładnego przemyślenia.
Programy gwintowane
Jeśli program jest wielowątkowy, użycie exit()jest dramatyczną akcją, która kończy wszystkie wątki. Wyjście z całego programu będzie prawdopodobnie niewłaściwe. Może być właściwe wyjście z wątku i zgłoszenie błędu. Jeśli znasz projekt programu, być może jednostronne wyjście jest dopuszczalne, ale generalnie nie będzie do zaakceptowania.
Kod biblioteki
I ta klauzula „świadomy projektu programu” odnosi się również do kodu w bibliotekach. Bardzo rzadko jest poprawne wywołanie funkcji biblioteki ogólnego przeznaczenia exit(). Słusznie byłbyś zdenerwowany, gdyby jedna ze standardowych funkcji biblioteki C nie zwróciła się tylko z powodu błędu. (Oczywiście, jak funkcjonuje exit(), _Exit(), quick_exit(), abort()nie są przeznaczone do zwrotu, to co innego.) Funkcje w bibliotece C dlatego też „nie może upaść” lub powrót wskazanie błędu jakoś. Jeśli piszesz kod, który ma trafić do biblioteki ogólnego przeznaczenia, musisz dokładnie rozważyć strategię obsługi błędów w swoim kodzie. Powinien pasować do strategii obsługi błędów programów, z którymi ma być używany, lub można skonfigurować obsługę błędów.
Mam szereg funkcji bibliotecznych (w pakiecie z nagłówkiem "stderr.h", nazwą, która krąży po cienkim lodzie), które są przeznaczone do zakończenia, ponieważ są używane do raportowania błędów. Te funkcje kończą się zgodnie z projektem. W tym samym pakiecie znajduje się szereg funkcji, które zgłaszają błędy i nie zamykają się. Wychodzące funkcje są oczywiście implementowane w kategoriach funkcji nie wychodzących, ale jest to wewnętrzny szczegół implementacji.
Mam wiele innych funkcji bibliotecznych i wiele z nich polega na "stderr.h"kodzie do raportowania błędów. To decyzja projektowa, którą podjąłem i z którą się zgadzam. Ale kiedy błędy są zgłaszane za pomocą funkcji, które kończą pracę, ogranicza to ogólną użyteczność kodu biblioteki. Jeśli kod wywołuje funkcje raportowania błędów, które nie kończą się, to główne ścieżki kodu w funkcji muszą poradzić sobie z błędami, zwracając je normalnie - wykryj je i przekaż wskazanie błędu do kodu wywołującego.
Kod mojego pakietu raportowania błędów jest dostępny w moim repozytorium SOQ (Stack Overflow Pytania) na GitHub jako pliki stderr.coraz stderr.hw podkatalogu src / libsoq .