Sytuacja: łączenie strony ecommerce (woo, presta, itp) z systemem ERP. W uproszczeniu: na stronie ecommerce klient sklepu składa zamówienie, obsługa sklepu gapi się w ERP, kiedy tam pojawi się nowe zamówienie to zaczynają je realizować. Język (to narzucone z góry) C#. Nasz klient: małe sklepy.
Ciągle słyszę, że najgorsze, co się może zdarzyć, to nieprzeniesienie jakiegoś zamówienia. Szef żąda, by KAŻDY(!) wyjątek był bezwarunkowo łapany, zapisywany do logów i ignorowany. Nawet systemowy.
Jest to radykalnie sprzeczne ze zwykłą mądrością programistyczną, wedle której wyjątki (a) systemowe oraz (b) wynikłe z bugów w moim programie winny spowodować early fail. Jest to też radykalnie sprzeczne z domyślnym zachowaniem C#, gdzie wyjątki domyślnie przerywają normalny bieg programu i, o ile nie są złapane, crashują apkę.
Łapanie wyjątków systemowych to głupota - przecież kiedy taki poleci, to choćbym napisał sto tysięcy linijek kodu obsługującego błędy, nie jestem w stanie naprawić sytuacji. Kiedy poleci OutOfMemoryException to program przecież musi się scrashować, siła wyższa.
Ale co w kwestii wyjątków wynikłych z bugów w programie? (NullReferenceException, IndexOutOfRangeException, itp) Rozmawiałem z szefem i z klientem i muszę przyznać, że uznaję ich argumenty.
Ich mentalność jest mniej więcej taka:
Załóżmy, że spada zamówienie, ale jego przeniesienie do ERP generuje wyjątki. Co się wtedy dzieje w najlepszej możliwej sytuacji? Obsługa sklepu czyta logi, dzwoni do supportu, następnego dnia przychodzi człowiek z supportu, bada sytuację, aha jest bug, naprawimy, znowu następnego dnia powstaje nowa wersja naszej apki, umawiamy się na wdrożenie, mija kilka dni co najmniej zanim sklep zacznie wreszcie realizować zamówienie, klient sklepu wściekły. Nie możemy pozwalać sobie na powodowanie kilkudniowych przestojów w działalności sklepu!
Bardziej realistycznie: nikt nie czyta logów, nikt nie wie nawet, że program się crashuje, obsługa sklepu gapi się tylko w ERP, tam nie ma zamówień bo nie są przenoszone ze strony ecommerce, więc popijają herbatkę. I to trwa tydzień, zanim ktoś wreszcie wpadnie na pomysł by sprawdzić, co się dzieje.
Zwróć uwagę YetAnohterone, że to są małe firmy, nie zatrudniające często adminów na pełen etat. Cała załoga firmy to często ludzie nietechniczni. Oczekują, by program, po instalacji, pozwolił o sobie zapomnieć. Ostatnią rzeczą, jaką sobie życzą, jest bycie molestowanymi komunikatami o błędach, z którymi mają coś robić.
Co się powinno stać zamiast odmowy przeniesienia zamówienia albo (co gorsza) crasha: błąd winien zostać zapisany do logów, ale zamówienie winno zostać przeniesione do ERP, choćby połowicznie. Support jest automatycznie informowany, że poleciał błąd, więc zaczyna prace nad diagnozą i naprawą. Adres odbiorcy zawiera śmieci? Nic strasznego, sklep może zacząć kompletować zamówienie, a adres może zostać poprawiony chociażby ręcznie. W międzyczasie support naprawi błąd i następne podobne przypadki nie będą źle przenosić adresu. Brakuje jakiejś pozycji na zamówieniu? Sklep przeprosi i dośle klientowi brakujący towar. Cena na fakturze jest zła? Wystawi się fakturę korygującą. Wszystko to, choć niepożądane, jest o niebo lepsze, niż odmowa przeniesienia zamówienia.
Bug oczywiście trzeba naprawić, ale niedopuszczalne jest, by pojawienie się buga blokowało pracę załogi sklepu.
Nie mam argumentów na coś takiego. Mentalność programistów jest zazwyczaj taka, by za wszelką cenę nie dopuszczać do błędnego działania programu, jeśli trzeba, to ubijając program. Ale mentalność managmentu jest taka, by za wszelką cenę nie dopuszczać do przerwy w działaniu programu, jeśli trzeba, to poświęcając poprawność zwracanych danych. To jest chyba decyzja biznesowa, a nie techniczna, by zważyć, która z tych opcji jest mniej szkodliwa. Więc chyba nawet nie jestem odpowiednią osobą, by forsować dogmat, że należy robić early fail.
Ale jak mam to zrobić w C#? Każdą linijkę kodu otaczać w try/catch?? To absurd.
Tak sobie pomyślałem, że gdybym pisał w PHP, to byłoby łatwiej się z tym chrzanić, bo tam można ustawić domyślne ignorowanie błędów, ale - oczywiscie - nikt tego w poważnych projektach nie robi.
Trochę nie wiem, co mam z tym zrobić.
Side note: Zdaje się, że nie jestem sam z tym problemem. Widziałem już w internecie osobę, która twierdziła, że tez pisała połączenie między ecommerce i erp i miała dokładnie takie same wymogi biznesowe.