Jak przypisujesz kody błędów?

13

W jaki sposób, opracowując średni projekt, identyfikujesz, tworzysz i utrzymujesz kody błędów?

Przez całe życie nie mogę wymyślić prostej i czystej metody. Niektóre z moich pomysłów konwertują nazwy klas i nazwy metod na ciąg liczb całkowitych, ale jest to zbyt długi sposób na wyświetlenie użytkownikowi poza tym, że nazwy metod i nazw klas mogą się zmienić (mam nadzieję, że nie!). Inni używają tylko systemu dziennika inkrementacji (tj. Kiedy tworzę nowy komunikat o błędzie, po prostu dodaj 1 do identyfikatora ostatniego komunikatu o błędzie). Ale to jest po prostu całkowicie niezorganizowane.

Mówiąc dokładniej, mówię o kodzie błędu, takim jak:

Error 401 Unauthorized.

Ahodder
źródło
1
kody błędów? Jak „magiczne liczby”? Na przykład ... BŁĄD 001. Następnie przejdź do listy i przeczytaj BŁĄD 001 oznacza, że ​​bla bla bla ... Tak?
wleao
@wleao - Yessir. Przeredaguję moje pytanie, aby to uwzględnić. Dziękuję Ci.
ahodder
Jak edytowałeś w swoim pytaniu. Zobacz, jak to robią za pomocą protokołu http. Nie wiem, czy w ogóle warto używać magicznych liczb. Jeśli jednak naprawdę chcesz to zrobić, zastosuj się do ich koncepcji. Na przykład mają taksonomię błędów (masz to?).
wleao
@wleao - jeszcze nie, ale dzięki Wam i Péterowi Török na pewno będę je tworzył. :)
ahodder

Odpowiedzi:

16

Nie.

Kody błędów są anachronizmem, wywodzą się z dawnych czasów, kiedy wyjście było naprawdę trudne i kosztowne, a jedynym sposobem sygnalizowania błędu może być kilka lampek na przednim panelu: Panel przedni pdp11 / 70

Obecnie mamy dojrzałą obsługę wyjątków wbudowaną w prawie każdy główny język. Użyj tego. Podaj informacje o użytkowniku, z którymi może współpracować; nie zawracaj im głowy technicznymi bla-bla, ale raczej powiedz im z grubsza, co poszło nie tak i co mogą z tym zrobić. Aby się zalogować, podaj wyjątki opisowe nazwy i zaloguj się. Łatwiejsze do zapamiętania, a także łatwiejsze do znalezienia za pomocą grep lub podobnych narzędzi wyszukiwania.

Wyjątkiem jest oczywiście programowanie w sytuacjach, w których wyjście jest nadal trudne i kosztowne, takich jak systemy wbudowane lub protokoły sieciowe. HTTP nadal używa numerycznych kodów odpowiedzi, ponieważ są one wyjątkowo łatwe do efektywnego parsowania - w niektórych sytuacjach odczyt tylko pierwszej cyfry może powiedzieć ci już wystarczająco dużo, a ty możesz odrzucić resztę pakietu.

tdammers
źródło
Dziękuję za szczegółową odpowiedź, która ma wiele sensu i jest dobra.
ahodder
Twoje użycie ilustracji idealnie pasuje do twojego argumentu. Czytałem o PDP-11 na zawsze. Ale to właściwie pierwszy, jaki kiedykolwiek widziałem. Dzięki.
Mike Owens,
2
Wewnątrz kodu wolałbym obsługiwać kod błędu i nie jestem aż tak stary.
JeffO
@Jeff: Wszystko, co można zrobić z kodami błędów, można również zrobić z wyjątkami, a potem nieco więcej. Jeśli chcesz naśladować kody błędów z wyjątkami, wszystko, co musisz zrobić, to rzucić zamiast zwracać kod błędu i złapać zamiast porównywać wartość zwracaną z E_OK (lub jakąkolwiek odpowiedzią OK). Szczerze mówiąc, C nie ma żadnych wyjątków, a długie skoki nie są tak wygodne, więc jeśli robisz C, jesteś nieco usprawiedliwiony.
tdammers
@Mike: Zdjęcie pochodzi z artykułu w Wikipedii na temat serii PDP-11; jeśli nie jest to łatwe do znalezienia, nie wiem, co jest.
tdammers
6

Powinieneś sprawdzić, w jaki sposób kody błędów / statusu są zorganizowane we wspólnych protokołach, takich jak HTTP . Zastrzegają różne zakresy dla różnych typów statusów / błędów. Ułatwia to zarówno użytkownikom identyfikację nieznanego kodu stanu, jak i programistom przypisanie kodu dla nowego rodzaju błędu, który nie był wcześniej obsługiwany.

Péter Török
źródło
Dodaj do swojej odpowiedzi taksonomię. Ułatwi to zarządzanie i utrzymywanie błędów.
wleao
3

Niestety, po co w ogóle używać kodów błędów?
Złap wyjątek, zaloguj go i zaoferuj wysłanie raportu, jeśli program nie może odzyskać .

(Zakładając, że Twój język obsługuje wyjątki).

Jedyną istotną informacją, która może pomóc w naprawieniu błędu, jest ślad stosu, którego nie otrzymujesz z kodem błędu. (Zakładam również, że chcesz używać kodów błędów do raportów błędów i nie rzucać ich w twarz użytkownika).

Dan
źródło
To prawda i robię to, ale co mam powiedzieć użytkownikom? Jestem pewien, że byliby wściekli, gdyby szli naprzód, a aplikacja po prostu umarłaby, bez żadnego wyjaśnienia ani niczego, co można by zirytować.
ahodder
6
Myślę, że są tu co najmniej trzy różne rzeczy, które się mylą. Pierwszy to kody używane od oprogramowania do oprogramowania, jak w HTTP. Drugi to kody, które użytkownicy mogą wykorzystać w raporcie błędów (np. Numery incydentów). Ostatnie to wiadomości, które mogą być wyświetlane użytkownikowi. Pomóc może uznać je za osobne rzeczy.
Darien,
2
Jednym z głównych powodów używania kodów błędów jest tworzenie aplikacji zaplecza. Program kliencki jest znacznie łatwiejszy i bardziej elegancki w interpretowaniu kodu i reagowaniu na kod niż na komunikat o błędzie lub śledzenie stosu. Nie wszystkie błędy pochodzą z błędów.
Kaypro II,
1
Wyjątki są bardzo trudne do osiągnięcia! Zobacz linki w: programmers.stackexchange.com/questions/97874/...
Coder
@ Koder: Twój przykład narusza wyjątki. Powinieneś złapać to, czego oczekujesz, że zostaniesz rzucony . Większość metod nie musi oczekiwać wyrzucenia nawet jednego wyjątku. Decyzja o tym, jak sobie z tym poradzić , spoczywa całkowicie na programistach. Zgadzam się, że może to być trudne .
Dan
2

Przyjmuję kontekst proceduralny (C). Jeśli masz obiekty, obiekt błędu jest zwykle lepszy, niezależnie od tego, czy jest to wyjątek, czy nie.

Powinieneś używać kodów błędów lokalnych dla każdego modułu. W przypadku biblioteki możesz mieć specjalny nagłówek zawierający kody błędów, z numerami 1, 2 itd. (Lub -1, -2, jeśli wolisz). Zawsze zwracaj jeden z tych kodów, np. Przetłumacz errnona własne kody. Jeśli masz wiele warstw modułów, tłumacz na każdym kroku (lub wstępnie zdefiniuj zakres dla głębszego błędu, np. Wartości 1001–1050 pochodzą z tego drugiego modułu).

Ważne jest również, aby zapewnić środki do tłumaczenia kodu na ciąg znaków. Nigdy nie powinieneś zgłaszać tylko kodu, który prowadzi tylko do frustracji. Właściwie każdy kod w twojej aplikacji powinien być wyposażony w funkcję tłumaczenia łańcucha. Na przykład libc zwykle ma strerrori strsignal, ale niestety brakuje strwaitstatus.

Per Johansson
źródło
fantastyczny detal, dziękuję. To jest naprawdę bardzo pomocne.
ahodder