Powiedzmy, że mamy metodę, która zwraca jakiś Result/Either
. Chcemy, aby klient tej metody patrząc na kod błędu wiedział, co poszło nie tak. Widzę 3 opcje:
-
Zwracamy jakiś generyczny
AppError
dający nam dość ogólną informację o błędzie (NotValid
,NotFound
), szczegóły są we właściwościMessage
.
Zalety: Prostota
Wady: Żeby dowiedzieć się, co dokładnie się posypało, musimy zajrzeć doMessage
. Podobnie klient naszego API webowego nie wie, co dokładnie się stało (może jedynie przekazaćMessage
do użytkownika końcowego). Słabo się to testuje, jeśli metoda może zwrócić np. z 3 różnych powodówNotValid
a my w teście chcemy mieć pewność, że nasza metoda zwróciła błąd z powoduX
, a nieY
. -
Dla każdej metody tworzymy jakiegoś enuma z typem błędu specyficznym dla danej metody.
Zalety: Znika problem z testowaniem z podejścia (1). Kod błędu możemy przekazać klientowi we zwrotce z API. Wszystko jest explicit.
Wady: Dużo tych enumów trzeba będzie potworzyć :/ -
Dla każdego modułu tworzymy jakiś globalny słownik możliwych błędów (podejście pośrednie między (1) i (2)).
Zalety: Podobnie jak w (2).
Wady: Nie jesteśmy już tak explicit jak w punkcie (2) - słownik może mieć np. 40 kodów błędów, a nasza metoda może zwracać np. tylko 3 różne kody błędów. Sygnatura metody jest zbyt ogólna, podobnie jak pewnie będzie dokumentacja endpointu w swaggerze.
Którą opcję wybrać i kiedy?