Błędy mydła czy rezultaty?

Rozmawiałem o tym ze współpracownikiem i nie mogliśmy dojść do porozumienia, więc chciałem poznać twoje przemyślenia. Mam własne zdanie na ten temat, ale nie zepsuję ci tego.

Kiedy powinienem zwracać Błąd SOAP i kiedy powinienem zwracać obiekt wynikowy , który zawiera informacje o błędzie? Załóżmy, że jest to ogólna usługa internetowa, która może być używana przez różne systemy (. NET, Java, cokolwiek). Obiekt wynikowy miałby flaga isError, typ błędu (podobny do określonego typu wyjątku) i wiadomość.

Kilka punktów do rozważenia:

  1. czy błąd walidacji danych jest błędem?
  2. czy powinna istnieć kombinacja błędów (dla bardzo wyjątkowych przypadków) i obiektu wyników (dla "oczekiwanych" błędów)?
  3. Jak pogrupować błędy SOAP (krytyczne [null reference] vs Walidacja [Kod Pocztowy nieprawidłowy])?
  4. Fail-fast vs konieczność pamiętania o sprawdzaniu błędów
  5. najlepsze praktyki, wzory, standardy itp.

Linki do artykułów są poprawne. Mimo, że brzmi to tak, jakbym chciał Twojej opinii, Proszę trzymać się faktów (x jest lepsze ze względu na y i z...)

Author: Seymour, 2010-05-12

4 answers

Większość klientów SOAP konwertuje błędy na wyjątek runtime (jeśli jest to coś, co obsługuje język klienta). Mając to na uwadze, myślę, że można przeformułować pytanie jako "Kiedy chcę rzucić wyjątek zamiast zwracać wartość błędu"? Jestem pewien, że możesz znaleźć wiele opinii na temat tego projektu API w ogóle, a w szczególności na ten temat.

To powiedziawszy, zwracanie błędu zwykle nie jest pomocne dla Klienta:

  1. Klient musi ręcznie wylicz i obsłuż swoje kody błędów, a nie pozwól, aby Kod początkowy generował i wyrzucał wyjątek odpowiedniego typu. Używanie kodów błędów uniemożliwia klientowi korzystanie z technik obiektowych, takich jak obsługa wyjątków przez superclass.

  2. Jeśli Twoje kody błędów nie będą częścią WSDL; klient nie będzie miał dokumentacji na temat tego, czym są i kiedy występują. Typowane błędy są częścią WSDL i dlatego (w pewnym ograniczonym zakresie) samokontrola.

  3. Komunikaty o błędach mogą zawierać kontekst specyficzny dla błędów, który klient może wykorzystać do raportowania błędów i odzyskiwania. Na przykład, wyrzucenie błędu walidacji wejściowej zawierającego rzeczywisty nieprawidłowy element wejściowy i przyczynę. Jeśli zwrócisz wynik z kodem błędu i nieprzezroczystym ciągiem znaków, Klient ma mały wybór, jak tylko przekazać komunikat o błędzie użytkownikowi, co łamie internacjonalizację, spójność interfejsu itp.

Aby odpowiedzieć na twoje pytania szczegółowe:

  1. Błąd walidacji jest błędem. Wyobraź sobie, że wywołujesz usługę internetową z klienta AJAX z ograniczoną zdolnością obsługi błędów; chcesz, aby usługa zwróciła kod HTTP 5XX, a nie kod sukcesu 400 z nieoczekiwaną odpowiedzią.

  2. Nie. Interfejsy API powinny zapewniać spójne interfejsy raportowania błędów. WSDL design to projektowanie API. Zmuszanie klienta do wdrożenia dwóch odrębnych procedur obsługi błędów nie sprawia, że życie klienta łatwiej.

  3. Projekt usterki powinien odzwierciedlać twój model żądania/odpowiedzi i wyświetlać informacje odpowiednie do abstrakcji usługi. Nie projektuj błędu NullReference; projektuj wartość XYZServiceRuntimeFault. Jeśli klienci często dostarczają nieprawidłowe żądania, Zaprojektuj InvalidRequestFault z odpowiednimi podklasami, aby klienci mogli szybko dowiedzieć się, gdzie są nieprawidłowe dane.

 59
Author: gibbss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-21 18:17:11

Obiekt results powinien zawierać tylko wyniki. Jeśli obiekt result dostarcza listę błędów, które wystąpiły w innym systemie, to jest to przykład, kiedy możesz mieć i flagę "isError"; w przeciwnym razie nie możesz, ponieważ wynik jest ważny lub nie.

Zawsze powinieneś używać SOAPFault, gdy wystąpi błąd. Walidacja jest błędem i pułapką diabłów jest myślenie o walidacji jako o mniej poważnej niż niemożność otwarcia bazy danych. Oba przypadki mają ten sam wpływ-operacja nie może zostać zakończona zgodnie z żądaniem.

Więc powinieneś używać obiektów wynikowych dla wyników i błędów SOAP dla wszystkiego, co uniemożliwia poprawny obiekt wynikowy; w tym, ale nie ograniczając się do błędów, błędów walidacji, ostrzeżeń, błędów magistrali itp..

W dniach poprzedzających wyjątki nie było wyboru i w rezultacie wiele interfejsów API stało się niespójnych, a większość interfejsów API różniła się sposobem zwracania błędu. Było (i nadal jest) straszne, mylące i często spowalnia rozwój, ponieważ musisz sprawdzić, jak każdy wpis API zwraca błąd, a często jak dekodować lub dowiedzieć się więcej o błędzie.

  1. Obsługa walidacji za pomocą Soapfaults / Exceptions jest bardziej logiczna, gdy o tym pomyślisz, a gdy już o tym pomyślisz, zwykle jest łatwiejsza. Należy zaprojektować klasę błędów walidacji w taki sposób, aby zawierała ona wystarczające informacje, aby zidentyfikować elementy naruszające prawo w sposób niekoniecznie wymagający pierwotnego żądania. This way you może zacząć obsługiwać błędy walidacji bardziej ogólnie.

  2. Jeśli obiekt results zawiera błędy, mogą one znajdować się tylko w domenie wyników; na przykład Product out of stock ponieważ ktoś w wharehouse nie może liczyć jest w domenie kontroli zapasów.

  3. Nie jest mądre rozróżnianie między błędem krytycznym a błędem walidacji, to moim zdaniem nie jest poprawne porównanie, ponieważ każde przypisanie poziomu ważności jest bardzo subiektywne. Na przykład w systemie dostarczającym informacje o chemikaliach strażakowi, krytyczne prawdopodobnie oznacza, że ciężarówka w ogniu niesie UN 1298 i UN 1436, a nie zerowe odniesienie podczas próby załadowania Grafiki ostrzegawczej.

    Zaprojektuj usterki, aby umożliwić ich zwięzłą identyfikację i odpowiednie postępowanie. Zapewnić, aby przekazywały one wystarczające informacje. Kategoryzacja abrytrary jest czymś, co jest niezauważalne, gdy masz wystarczającą ilość informacji, ponieważ Wina pozwoli się zidentyfikować.

  4. SOAPFaults zamienione w wyjątki są najpewniejszym sposobem na szybkie niepowodzenie.

  5. Najlepsze praktyki, referencje itp.

 45
Author: Richard Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 04:05:12

Myślę, że krótka odpowiedź to użyj błędu mydła, chyba że wiesz, że klient będzie przygotowany do obsługi błędu zwróconego w wyniku. Myślałem również o analogii między wyjątkami a błędami, jak wspomniano w innych odpowiedziach.

Istnieją szare obszary, które mogą być zarówno racjonalnie traktowane jako wyjątki, jak i jako błędy w wyniku w zależności od potrzeb klienta. Następnie możesz podać parametr do usługi, który zmienia sposób zwracania tego typu błędów. Na domyślne jest użycie błędu SOAP, ale jeśli klient ustawia parametr, aby uzyskać wynik błędu, to oznacza, że jest gotów obsłużyć to jako część wyniku. Dla mnie błędy walidacji są w tej szarej strefie. W przypadku większości klientów powinny one być uważane za błędy, ale jeśli klient chce użyć danych do oznaczania interfejsu użytkownika błędami walidacji, zwrócenie błędów walidacji jako części wyniku może być bardziej użyteczne. 

 8
Author: mdma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 20:25:40

Zasada, którą kieruję się w projektowaniu usług to:

  • poziom biznesowy odpowiedź (nawet wyjątki biznesowe) do obiektów odpowiedzi
  • poziom techniczny/integracyjny błędy w usterce Soap

Konsument usługi może polegać na tym, że wszelkiego rodzaju odpowiedzi biznesowe pojawiają się w obiektach odpowiedzi i prezentują je użytkownikom usług (biznesowych). Błędy Soap są używane tylko wtedy, gdy odpowiedź biznesowa nie może być dostarczona.

Błędy Soap powinny wywołać wsparcie Ostrzeżenie / działanie poprzez monitorowanie.

 1
Author: KarelHusa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 15:25:05