28 lip 2025·6 min czytania

Taksonomia błędów dla aplikacji biznesowych: spójny UI i monitoring

Taksonomia błędów dla aplikacji biznesowych pomaga sklasyfikować walidację, uwierzytelnianie, limity i awarie zależności, dzięki czemu alerty i zachowania UI są spójne.

Taksonomia błędów dla aplikacji biznesowych: spójny UI i monitoring

Co rozwiązuje taksonomia błędów w prawdziwych aplikacjach biznesowych

Taksonomia błędów to wspólny sposób na nazywanie i grupowanie błędów, dzięki czemu wszyscy je obsługują tak samo. Zamiast pozwalać każdemu ekranowi i API wymyślać własne komunikaty, definiujesz niewielki zestaw kategorii (np. walidacja czy auth) i reguły, jak mają się pojawiać w UI i w monitoringu.

Bez tej wspólnej struktury ten sam problem pojawia się w różnych formach. Brak wymaganego pola może być „Bad Request” na mobilce, „Coś poszło nie tak” w webie i stack trace w logach. Użytkownicy nie wiedzą, co zrobić dalej, a zespoły on-call tracą czas, zgadując, czy to błąd użytkownika, atak czy awaria.

Celem jest spójność: ten sam typ błędu prowadzi do tej samej reakcji UI i tej samej reakcji w alertach. Problemy walidacyjne powinny wskazywać konkretne pole. Problemy z uprawnieniami powinny zatrzymać akcję i wyjaśnić, jakie uprawnienie brakuje. Awarie zależności powinny oferować bezpieczny retry, podczas gdy monitoring podnosi odpowiedni alarm.

Przykład z życia: handlowiec próbuje utworzyć rekord klienta, ale serwis płatności jest niedostępny. Jeśli aplikacja zwróci ogólne 500, spróbuje ponownie i może później stworzyć duplikaty. Przy jasnej kategorii awarii zależności UI może poinformować, że serwis tymczasowo nie odpowiada, zablokować duplikaty i monitoring może powiadomić właściwy zespół.

Taka zbieżność ma największe znaczenie, gdy jedno zaplecze obsługuje wiele klientów. Jeśli API, web, mobilka i narzędzia wewnętrzne opierają się na tych samych kategoriach i kodach, awarie przestają wyglądać przypadkowo.

Prosty model: kategoria, kod, komunikat, szczegóły

Taksonomie łatwiej utrzymać, gdy oddzielisz cztery rzeczy, które często się mieszają: kategorię (jaki to rodzaj problemu), kod (stabilny identyfikator), komunikat (tekst dla człowieka) i szczegóły (ustrukturyzowany kontekst). Status HTTP wciąż ma znaczenie, ale nie powinien być całym opisem.

Kategoria odpowiada: „Jak powinien zachować się UI i monitoring?” 403 może znaczyć „auth” w jednym miejscu, a w innym 403 może być „policy”, jeśli dodasz reguły. Kategoria dotyczy zachowania, nie transportu.

Kod odpowiada: „Co dokładnie się stało?” Kody powinny być stabilne i nudne. Jeśli zmienisz nazwę przycisku lub zrefaktoryzujesz serwis, kod nie powinien się zmieniać. Dashboardy, alerty i skrypty wsparcia polegają na tym.

Komunikat odpowiada: „Co mówimy człowiekowi?” Zdecyduj, dla kogo jest komunikat. Komunikat skierowany do użytkownika powinien być krótki i uprzejmy. Komunikat dla supportu może zawierać kolejne kroki. Logi mogą być bardziej techniczne.

Szczegóły odpowiadają: „Co potrzebujemy, żeby to naprawić?” Trzymaj szczegóły ustrukturyzowane, aby UI mógł reagować. Dla błędu formularza to mogą być nazwy pól. Dla awarii zależności to może być nazwa serwisu zewnętrznego i wartość retry-after.

Oto kompaktowy kształt, którego wiele zespołów używa:

{
  "category": "validation",
  "code": "CUSTOMER_EMAIL_INVALID",
  "message": "Enter a valid email address.",
  "details": { "field": "email", "rule": "email" }
}

W miarę rozwoju funkcji trzymaj kategorie małe i stabilne, i dodawaj nowe kody zamiast ponownie używać starych. Dzięki temu zachowanie UI, trendy w monitoringu i playbooki wsparcia pozostaną wiarygodne w miarę ewolucji produktu.

Główne kategorie: walidacja, auth, limity, zależności

Większość aplikacji biznesowych może zacząć od czterech kategorii, które pojawiają się wszędzie. Jeśli nazwiesz je i traktujesz tak samo w backendzie, webie i mobilce, UI może reagować spójnie, a monitoring stanie się czytelny.

Walidacja (oczekiwane)

Błędy walidacji występują, gdy dane wejściowe użytkownika lub reguła biznesowa nie przejdą. To normalne i powinno być łatwe do naprawienia: brak obowiązkowego pola, niepoprawny format lub reguły typu „rabat nie może przekraczać 20%” albo „wartość zamówienia musi być > $0”. UI powinien podkreślić dokładne pole lub regułę, a nie pokazywać ogólny alert.

Uwierzytelnianie vs autoryzacja (oczekiwane)

Błędy auth zwykle dzielą się na dwa przypadki: nieautoryzowany (niezalogowany, wygasła sesja, brak tokena) oraz brak uprawnień (zalogowany, ale brak dostępu). Traktuj je inaczej. „Zaloguj się ponownie” pasuje do pierwszego przypadku. W drugim unikaj ujawniania wrażliwych szczegółów, ale bądź jasny: „Nie masz dostępu do zatwierdzania faktur.”

Limity/Rate limits (oczekiwane, ale czasowe)

Rate limiting oznacza „zbyt wiele żądań, spróbuj później”. Często pojawia się przy importach, obciążonych dashboardach lub powtarzających się retry. Dołącz wskazówkę retry-after (nawet „poczekaj 30 sekund”), i miej UI, które się wycofa zamiast bombardować serwer.

Awarie zależności (często nieoczekiwane)

Awarie zależności pochodzą z usług upstream, timeoutów lub outage’ów: dostawcy płatności, email/SMS, bazy danych lub serwisy wewnętrzne. Użytkownicy nie mogą ich naprawić, więc UI powinien zaoferować bezpieczny fallback (zapisz szkic, spróbuj później, skontaktuj się z supportem).

Kluczowa różnica to zachowanie: błędy oczekiwane są częścią normalnego przepływu i zasługują na precyzyjny feedback; błędy nieoczekiwane sygnalizują niestabilność i powinny wywołać alerty, correlation IDs i ostrożne logowanie.

Krok po kroku: zbuduj taksonomię na jednym warsztacie

Taksonomia powinna być na tyle mała, by dało się ją zapamiętać, ale na tyle rygorystyczna, by dwa zespoły zaklasyfikowały ten sam problem tak samo.

1) Ogranicz czas i wybierz mały zestaw

Zacznij od warsztatu 60–90 minut. Wypisz błędy, które widzisz najczęściej (błędne dane, problemy z logowaniem, za dużo żądań, awarie zewnętrzne, niespodziewane błędy), a następnie skup je w 6–12 kategorii, które każdy potrafi wypowiedzieć na głos bez sprawdzania dokumentu.

2) Uzgodnij stabilny schemat kodów

Wybierz wzorzec nazewnictwa, który pozostanie czytelny w logach i ticketach. Trzymaj go krótko, unikaj numerów wersji i traktuj kody jako trwałe po wydaniu. Popularny wzorzec to prefiks kategorii plus czytelny slug, np. AUTH_INVALID_TOKEN lub DEP_PAYMENT_TIMEOUT.

Przed wyjściem z sali zdecyduj, co każdy błąd musi zawierać: kategorię, kod, bezpieczny komunikat, ustrukturyzowane szczegóły i trace lub request ID.

3) Napisz jedną regułę dla kategorii vs kodu

Zespoły utkną, gdy kategorie staną się skarbcem na wszystko. Prosta reguła pomaga: kategoria odpowiada „Jak powinien zareagować UI i monitoring?”, kod odpowiada „Co dokładnie się stało?”. Jeśli dwie awarie wymagają różnego zachowania UI, nie powinny dzielić kategorii.

4) Ustal domyślne zachowanie UI dla każdej kategorii

Zdecyduj, co użytkownicy widzą domyślnie. Walidacja podświetla pola. Auth kieruje do logowania lub pokazuje komunikat o dostępie. Limity pokazują „spróbuj ponownie za X sekund”. Awarie zależności pokazują spokojny ekran retry. Gdy takie domyślnie istnieją, nowe funkcje mogą je przyjąć zamiast wymyślać jednorazowe zachowania.

5) Testuj na realnych scenariuszach

Przeprowadź pięć typowych przepływów (rejestracja, checkout, wyszukiwanie, edycja admina, upload pliku) i oznacz każde wystąpienie błędu. Jeśli grupa się kłóci, zazwyczaj potrzebujesz jednej jaśniejszej reguły, a nie dwudziestu kolejnych kodów.

Błędy walidacji: spraw, by były możliwe do naprawienia przez użytkownika

Jeden system błędów dla wszystkich
Zbuduj jedno zaplecze i zachowaj spójność obsługi błędów w aplikacjach web, mobilnych i narzędziach wewnętrznych.
Wypróbuj AppMaster

Walidacja to jedyny typ błędu, który zwykle chcesz pokazywać natychmiast. Powinna być przewidywalna: mówi użytkownikowi, co naprawić i nigdy nie wywołuje pętli retry.

Błędy na poziomie pola i formularza to różne problemy. Błąd na poziomie pola dotyczy jednego inputu (email, telefon, kwota). Błąd na poziomie formularza dotyczy kombinacji pól (data początku musi być przed datą końca) lub brakujących prerekwizytów (nie wybrano metody wysyłki). Odpowiedź API powinna to jasno rozróżniać, aby UI mógł odpowiednio zareagować.

Typową regułą biznesową jest „przekroczony limit kredytowy.” Użytkownik mógł wpisać poprawną liczbę, ale operacja jest zabroniona z powodu statusu konta. Traktuj to jako błąd walidacji na poziomie formularza z jasnym powodem i bezpieczną wskazówką, np. „Dostępny limit to $500. Zmniejsz kwotę lub poproś o jego zwiększenie.” Unikaj ujawniania wewnętrznych nazw pól, modeli scoringowych czy kroków silnika reguł.

Odpowiedź nadająca się do akcji zwykle zawiera stabilny kod (nie tylko zdanie po angielsku), przyjazny komunikat dla użytkownika, opcjonalne wskazania pól dla błędów na poziomie pola oraz krótkie bezpieczne podpowiedzi (przykłady formatów, dozwolone zakresy). Jeśli potrzebujesz nazwy reguły dla inżynierów, umieść ją w logach, nie w UI.

Loguj błędy walidacji inaczej niż błędy systemowe. Chcesz wystarczająco kontekstu, by znaleźć wzorce, nie przechowując wrażliwych danych. Zapisz ID użytkownika, ID żądania, nazwę reguły lub kod i które pola zawiodły. Dla wartości loguj tylko to, co potrzebne (często „obecne/brak” lub długość) i maskuj wszystko wrażliwe.

W UI skup się na naprawie, nie na ponawianiu. Podświetl pola, zachowaj wpisane dane, przewiń do pierwszego błędu i wyłącz automatyczne retry. Błędy walidacji nie są tymczasowe, więc „spróbuj ponownie” marnuje czas.

Błędy uwierzytelniania i uprawnień: zachowaj bezpieczeństwo i jasność

Błędy uwierzytelniania i autoryzacji wyglądają podobnie dla użytkowników, ale znaczą różne rzeczy dla bezpieczeństwa, przepływu UI i monitoringu. Ich rozdzielenie ujednolica zachowanie w webie, mobilce i klientach API.

Nieautoryzowany oznacza, że aplikacja nie może potwierdzić tożsamości użytkownika. Typowe przyczyny: brak danych uwierzytelniających, nieprawidłowy token lub wygasła sesja. Forbidden oznacza, że użytkownik jest znany, ale nie ma prawa wykonać akcji.

Wygasła sesja to najczęstszy przypadek brzegowy. Jeśli wspierasz refresh tokeny, spróbuj wykonać ciche odświeżenie raz, a potem powtórzyć oryginalne żądanie. Jeśli refresh zawiedzie, zwróć błąd nieautoryzowany i skieruj użytkownika do logowania. Unikaj pętli: po jednej próbie odświeżenia zakończ i pokaż jasny kolejny krok.

Zachowanie UI powinno być przewidywalne:

  • Nieautoryzowany: poproś o logowanie i zachowaj to, co użytkownik próbował zrobić
  • Forbidden: pozostań na stronie i pokaż komunikat o braku dostępu oraz bezpieczną akcję typu „poproś o dostęp”
  • Konto zablokowane lub odebrane: wyloguj i pokaż krótki komunikat, że support może pomóc

Dla audytu loguj wystarczająco, by odpowiedzieć „kto co próbował i dlaczego został zablokowany”, bez ujawniania sekretów. Przydatny zapis to ID użytkownika (jeśli znany), tenant lub workspace, nazwa akcji, identyfikator zasobu, znacznik czasu, ID żądania i wynik sprawdzenia polityki (dozwolone/odrzucone). Trzymaj surowe tokeny i hasła poza logami.

W komunikatach dla użytkownika nie ujawniaj nazw ról, reguł uprawnień czy wewnętrznej struktury polityk. „Nie masz dostępu do zatwierdzania faktur” jest bezpieczniejsze niż „Tylko FinanceAdmin może zatwierdzać faktury.”

Błędy limitów: przewidywalne zachowanie przy wzroście obciążenia

Obsługuj limity spokojnie
Dodaj retry-after i logikę backoff raz, aby każdy klient obsługiwał 429 w ten sam sposób.
Wypróbuj AppMaster

Limity to nie bug — to bariera bezpieczeństwa. Traktuj je jako pełnoprawną kategorię, aby UI, logi i alerty reagowały przewidywalnie przy wzroście ruchu.

Rate limits zwykle przybierają kilka postaci: na użytkownika (jedna osoba klika zbyt szybko), na IP (wielu użytkowników za jedną siecią biurową) lub na klucz API (jedna integracja działa nadmiernie). Przyczyna ma znaczenie, bo naprawa jest inna.

Co powinna zawierać dobra odpowiedź przy rate-limit

Klienci potrzebują dwóch rzeczy: informacji, że są ograniczeni, i kiedy spróbować ponownie. Zwróć HTTP 429 plus czytelny czas oczekiwania (np. Retry-After: 30). Dołącz też stabilny kod błędu (np. RATE_LIMITED), żeby dashboardy mogły grupować zdarzenia.

Utrzymuj komunikat spokojny i konkretny. „Too many requests” jest prawdziwe, ale mało pomocne. „Proszę poczekać 30 sekund i spróbować ponownie” ustawia oczekiwania i redukuje powtarzalne kliknięcia.

Po stronie UI zapobiegaj szybkim retry. Prosty wzorzec to wyłączenie akcji na okres oczekiwania, pokazanie krótkiego odliczania, a po zakończeniu zaoferowanie jednej bezpiecznej próby. Unikaj sformułowań sugerujących utratę danych.

W monitoringu zespoły często przesadzają. Nie wzywaj na każde 429. Monitoruj tempo i alertuj przy nietypowych skokach: nagły wzrost dla konkretnego endpointu, tenantu lub klucza API jest akcjonowalny.

Po stronie backendu zachowanie też powinno być przewidywalne. Używaj wykładniczego backoffu dla automatycznych retry i rób retry idempotentne. Akcja „Utwórz fakturę” nie powinna tworzyć dwóch faktur, jeśli pierwsze żądanie faktycznie się powiodło.

Awarie zależności: obsługuj outage bez chaosu

Wdróż tam, gdzie potrzebuje tego zespół
Wdróż do AppMaster Cloud lub na własny AWS, Azure, albo Google Cloud.
Wdróż aplikację

Awarie zależności to te, których użytkownik nie naprawi lepszym inputem. Użytkownik zrobił wszystko poprawnie, ale bramka płatności się nie odzywa, połączenie do bazy spadło albo upstream zwrócił 5xx. Traktuj je jako oddzielną kategorię, by UI i monitoring reagowały przewidywalnie.

Nazwij powszechne kształty awarii: timeout, błąd połączenia (DNS, TLS, refused) i upstream 5xx (bad gateway, service unavailable). Nawet jeśli nie znasz przyczyny, możesz uchwycić, co się stało i odpowiedzieć spójnie.

Retry czy szybkie zakończenie

Retry pomaga przy krótkich zakłóceniach, ale może też pogorszyć awarię. Używaj prostych reguł, aby każdy zespół podejmował tę samą decyzję.

  • Retryuj, gdy błąd jest prawdopodobnie tymczasowy: timeouty, reset połączenia, 502/503
  • Fail fast dla przypadków spowodowanych przez użytkownika lub trwałych: 4xx od zależności, nieprawidłowe poświadczenia, brak zasobu
  • Ogranicz retry (np. 2–3 próby) i dodaj mały backoff
  • Nigdy nie retryuj operacji nie-idempotentnych bez idempotency key

Zachowanie UI i bezpieczne fallbacks

Gdy zależność zawiedzie, powiedz użytkownikowi, co może zrobić dalej bez obwiniania go: „Tymczasowy problem. Proszę spróbować ponownie.” Jeśli istnieje bezpieczny fallback, zaoferuj go. Przykład: gdy Stripe jest niedostępny, pozwól zapisać zamówienie jako „Oczekujące płatności” i wyślij potwierdzenie e-mail zamiast utraty koszyka.

Chroń też przed podwójnymi submitami. Jeśli użytkownik kliknie „Zapłać” dwukrotnie w trakcie wolnej odpowiedzi, system powinien to wykryć. Użyj idempotency key dla flow tworzenia i pobierania opłaty lub sprawdzeń stanu typu „zamówienie już opłacone” przed ponownym wykonaniem akcji.

Dla monitoringu loguj pola, które szybko odpowiadają na pytanie: „Która zależność zawodzi i jak źle?” Zapisz nazwę zależności, endpoint lub operację, czas trwania i ostateczny wynik (timeout, connect, upstream 5xx). To sprawia, że alerty i dashboardy są znaczące zamiast hałaśliwych.

Uczyń monitoring i UI spójnymi w kanałach

Taksonomie działają tylko wtedy, gdy każdy kanał mówi tym samym językiem: API, web UI, aplikacja mobilna i logi. W przeciwnym razie ten sam problem pojawi się jako pięć różnych komunikatów i nikt nie będzie wiedział, czy to błąd użytkownika czy prawdziwa awaria.

Traktuj statusy HTTP jako warstwę drugorzędną. Pomagają przy proxy i podstawowym zachowaniu klienta, ale znaczenie niesie kategoria i kod. Timeout zależności może nadal mieć 503, ale kategoria mówi UI „spróbuj ponownie”, a monitoring wysyła pagowanie on-call.

Upewnij się, że każde API zwraca jeden standardowy kształt błędu, nawet gdy źródła są różne (baza danych, moduł auth, API zewnętrzne). Prosty kształt utrzymuje obsługę UI i dashboardy spójnymi:

{
  "category": "dependency",
  "code": "PAYMENTS_TIMEOUT",
  "message": "Payment service is not responding.",
  "details": {"provider": "stripe"},
  "correlation_id": "9f2c2c3a-6a2b-4a0a-9e9d-0b0c0c8b2b10"
}

Correlation ID to most między „użytkownik zobaczył błąd” a „możemy go prześledzić”. Pokaż correlation_id w UI (przycisk kopiowania pomaga) i zawsze loguj go po stronie backendu, aby móc śledzić jedno żądanie przez usługi.

Uzgodnij, co jest bezpieczne do pokazania w UI, a co tylko w logach. Praktyczny podział: UI dostaje kategorię, jasny komunikat i kolejny krok; logi dostają techniczne szczegóły błędu i kontekst żądania; obie strony dzielą correlation_id i stabilny kod błędu.

Szybka checklista dla spójnego systemu błędów

Standaryzuj odpowiedź błędu
Zaprojektuj kształt odpowiedzi API z ustrukturyzowanymi szczegółami, aby klienci mogli reagować przewidywalnie.
Utwórz backend

Spójność jest nudna w najlepszy możliwy sposób: każdy kanał zachowuje się tak samo, a monitoring mówi prawdę.

Sprawdź backend pierwszy, włączając zadania w tle i webhooks. Jeśli jakieś pole jest opcjonalne, ludzie je pominą i spójność się rozpadnie.

  • Każdy błąd zawiera kategorię, stabilny kod, bezpieczny komunikat i trace ID.
  • Problemy walidacyjne są oczekiwane, więc nie wywołują paging alertów.
  • Problemy auth i uprawnień są śledzone dla wzorców bezpieczeństwa, ale nie traktowane jak outage'y.
  • Odpowiedzi rate limit zawierają wskazówkę retry (np. sekundy do oczekiwania) i nie spamują alertów.
  • Awarie zależności zawierają nazwę zależności oraz informacje o timeoutach lub statusie.

Następnie sprawdź reguły UI. Każda kategoria powinna mapować do jednego przewidywalnego zachowania ekranu, aby użytkownicy nie musieli zgadywać, co robić dalej: walidacja podświetla pola, auth prosi o logowanie lub pokazuje dostęp, limity pokazują spokojne odczekanie, awarie zależności oferują retry i fallback gdy to możliwe.

Prosty test: wyzwól w stagingu jeden błąd z każdej kategorii i zweryfikuj, że wynik jest taki sam w web app, mobilce i panelu admina.

Najczęstsze błędy i praktyczne kolejne kroki

Najszybszy sposób na zepsucie systemu błędów to traktowanie go jako dodatek. Różne zespoły używają różnych słów, różnych kodów i różnych zachowań UI dla tego samego problemu. Praca nad taksonomią zwraca wartość, gdy pozostaje spójna.

Częste wzorce awarii:

  • Wycieki wewnętrznych tekstów wyjątków do użytkowników. Myli to ludzi i może ujawnić wrażliwe dane.
  • Oznaczanie każdego 4xx jako „walidacja.” Brak uprawnień to nie to samo co brak pola.
  • Wymyślanie nowych kodów per funkcja bez przeglądu. Kończy się to 200 kodami, które znaczą te same 5 rzeczy.
  • Retryowanie niewłaściwych błędów. Retryowanie błędu uprawnień lub złego adresu e-mail tworzy tylko hałas.

Prosty przykład: handlowiec wysyła formularz „Utwórz klienta” i dostaje 403. Jeśli UI potraktuje wszystkie 4xx jako walidację, podświetli losowe pola i poprosi o „naprawienie danych” zamiast powiedzieć, że potrzebuje dostępu. Monitoring pokaże wtedy skok „błędów walidacji”, gdy prawdziwy problem to role.

Praktyczne następne kroki mieszczące się w krótkim warsztacie: napisz jednostronicowy dokument taksonomii (kategorie, kiedy ich używać, 5–10 kanonicznych kodów), zdefiniuj reguły komunikatów (co widzi użytkownik vs co idzie do logów), dodaj lekką bramkę przeglądu dla nowych kodów, ustaw reguły retry według kategorii, a następnie zaimplementuj end-to-end (odpowiedź backendu, mapowanie w UI i dashboardy monitoringu).

Jeśli budujesz z AppMaster (appmaster.io), pomaga to scentralizować te reguły w jednym miejscu, aby ta sama kategoria i zachowanie kodu obowiązywały w backendzie, aplikacji web i natywnych aplikacjach mobilnych.

FAQ

Kiedy warto stworzyć taksonomię błędów?

Zacznij, gdy ten sam backend obsługuje więcej niż jednego klienta (web, mobile, narzędzia wewnętrzne) lub gdy support i on-call ciągle pytają: „To błąd użytkownika czy problem systemowy?” Taksonomia szybko się zwróci, gdy masz powtarzalne ścieżki (rejestracja, checkout, importy, edycje admina), gdzie spójne zachowanie ma znaczenie.

Z iloma kategoriami błędów powinniśmy zacząć?

Dobry punkt wyjścia to 6–12 kategorii, które ludzie zapamiętają bez sięgania do dokumentacji. Trzymaj kategorie stabilne i szerokie (np. validation, auth, rate_limit, dependency, conflict, internal), a szczegółową sytuację wyrażaj kodem, nie nową kategorią.

Jaka jest różnica między kategorią błędu a kodem błędu?

Kategoria determinuje zachowanie, kod identyfikuje dokładną sytuację. Kategoria mówi UI i monitoringowi co robić (podświetlić pola, poprosić o zalogowanie, odczekać, zaoferować retry), podczas gdy kod pozostaje stały dla dashboardów, alertów i skryptów wsparcia nawet jeśli tekst w UI się zmieni.

Czy komunikat powinien być taki sam jak kod błędu?

Traktuj komunikaty jako treść, a nie identyfikatory. Zwracaj krótki, bezpieczny komunikat dla UI i polegaj na stabilnym kodzie do grupowania i automatyzacji. Jeśli potrzebujesz bardziej technicznego opisu, trzymaj go w logach i powiąż z tym samym correlation ID.

Co powinien zawierać każdy response błędu API?

Zawrzyj kategorię, stabilny kod, bezpieczny komunikat dla użytkownika, ustrukturyzowane szczegóły i identyfikator żądania lub korelacji. Szczegóły powinny umożliwiać klientowi działanie, np. które pole zawiodło lub ile sekund poczekać, bez wyświetlania surowych wyjątków.

Jak uczynić błędy walidacji użytecznymi zamiast ogólnych?

Zwracaj wskaźniki na poziomie pól, gdy to możliwe, aby UI mógł podświetlić konkretny input i zachować wpisane dane. Używaj oddzielnej informacji form-level, gdy problem dotyczy kombinacji pól lub reguły biznesowej (np. zakresy dat, limit kredytowy), aby UI nie zgadywał niewłaściwego pola.

Jak powinniśmy obsługiwać błędy „nie zalogowany” vs „brak uprawnień”?

Nieautoryzowany (unauthenticated) oznacza, że użytkownik nie jest zalogowany lub token/session jest nieważny — UI powinien przekierować do logowania i zachować próbę akcji. Forbidden oznacza, że użytkownik jest znany, ale nie ma uprawnień — UI powinien pozostać na miejscu i pokazać komunikat o dostępie bez ujawniania szczegółów wewnętrznych polityk.

Jaki jest właściwy sposób implementacji błędów limitów (rate limit)?

Zwracaj jawny czas oczekiwania (np. wartość retry-after) i zachowaj stabilny kod, aby klienci mogli implementować spójny backoff. W UI wyłącz powtarzanie akcji i pokaż jasny krok następny, ponieważ szybkie automatyczne retry zwykle tylko pogarszają limitowanie.

Kiedy powinniśmy retryować awarie zależności i jak uniknąć duplikatów?

Retryuj tylko wtedy, gdy błąd jest prawdopodobnie tymczasowy (timeouty, reset połączenia, upstream 502/503) i ogranicz liczbę prób z małym backoffem. Dla działań nie-idempotentnych wymagaj idempotency key lub sprawdzenia stanu — inaczej retry może utworzyć duplikaty, gdy pierwsza próba jednak się powiodła.

W jaki sposób identyfikatory korelacji pomagają podczas incydentów i gdzie powinny się pojawiać?

Pokaż użytkownikowi identyfikator korelacji (by support mógł go podać), i zawsze loguj go po stronie serwera razem z kodem i kluczowymi szczegółami. Dzięki temu można prześledzić jedno zdarzenie przez usługi. W projektach AppMaster centralizacja tego kształtu pomaga utrzymać spójność backendu, web i natywnych aplikacji.

Łatwy do uruchomienia
Stworzyć coś niesamowitego

Eksperymentuj z AppMaster z darmowym planem.
Kiedy będziesz gotowy, możesz wybrać odpowiednią subskrypcję.

Rozpocznij