Od jakiegoś czasu zastanawiam się nad tym problemem i ciągle znajduję zastrzeżenia i sprzeczności, więc mam nadzieję, że ktoś może wyciągnąć wnioski na następujące tematy:
Preferuj wyjątki od kodów błędów
O ile mi wiadomo, od czterech lat pracy w branży, czytania książek i blogów itp. Najlepszą praktyką postępowania w przypadku błędów jest zgłaszanie wyjątków, a nie zwracanie kodów błędów (niekoniecznie kod błędu, ale kod błędu typ reprezentujący błąd).
Ale - dla mnie wydaje się to przeczyć ...
Kodowanie do interfejsów, a nie implementacji
Kodujemy do interfejsów lub abstrakcji, aby zredukować sprzężenie. Nie znamy ani nie chcemy wiedzieć, jaki jest typ i implementacja interfejsu. Skąd więc możemy wiedzieć, jakie wyjątki powinniśmy znaleźć? Implementacja może wyrzucić 10 różnych wyjątków lub może nie wygenerować żadnego. Kiedy wychwycimy wyjątek, z pewnością przyjmujemy założenia dotyczące wdrożenia?
Chyba że - interfejs ma ...
Specyfikacje wyjątków
Niektóre języki pozwalają programistom na stwierdzenie, że niektóre metody zgłaszają pewne wyjątki (na przykład Java używa throws
słowa kluczowego.) Z punktu widzenia kodu wywołującego wydaje się to w porządku - wiemy wyraźnie, które wyjątki mogą być potrzebne.
Ale - wydaje się to sugerować ...
Przeciekająca abstrakcja
Dlaczego interfejs powinien określać, które wyjątki mogą być zgłaszane? Co jeśli implementacja nie musi zgłaszać wyjątku lub musi zgłaszać inne wyjątki? Na poziomie interfejsu nie ma możliwości sprawdzenia, które wyjątki może wdrożyć implementacja.
Więc...
Podsumowując
Dlaczego wyjątki są preferowane, gdy wydają się (moim zdaniem) sprzeczne z najlepszymi praktykami w zakresie oprogramowania? A jeśli kody błędów są tak złe (i nie muszę być sprzedawany z wadami kodów błędów), czy istnieje inna alternatywa? Jaki jest obecny (lub niedługo) stan techniki obsługi błędów, który spełnia wymagania najlepszych praktyk opisanych powyżej, ale nie polega na sprawdzaniu kodu zwrotnego wartości kodów błędów?