Obecnie refaktoryzuję duży podsystem o architekturze wielowarstwowej i staram się zaprojektować skuteczną strategię rejestrowania błędów / obsługi.
Powiedzmy, że moja architektura składa się z następujących trzech warstw:
- Interfejs publiczny (IE i kontroler MVC)
- Warstwa Domeny
- Warstwa dostępu do danych
Moim źródłem zamieszania jest to, gdzie powinienem zaimplementować rejestrowanie błędów / obsługę:
Najłatwiejszym rozwiązaniem byłoby zaimplementowanie rejestrowania na najwyższym poziomie (np. Sterownik interfejsu publicznego \ MVC). Jednak wydaje się to niewłaściwe, ponieważ oznacza przepuszczenie wyjątku przez różne warstwy, a następnie zalogowanie go; zamiast rejestrować wyjątek u źródła.
Rejestrowanie wyjątku u źródła jest oczywiście najlepszym rozwiązaniem, ponieważ mam najwięcej informacji. Mój problem polega na tym, że nie mogę wychwycić każdego wyjątku u źródła bez przechwytywania WSZYSTKICH wyjątków, aw warstwie domena / interfejs publiczny doprowadzi to do wychwycenia wyjątków, które zostały już wychwycone, zarejestrowane i ponownie rzucone przez warstwę poniżej .
Inną możliwą strategią jest połączenie # 1 i # 2; dzięki czemu wychwytuję określone wyjątki na warstwie, które najprawdopodobniej zostaną wyrzucone (IE Łapanie, rejestrowanie i ponowne rzucanie
SqlExceptions
w warstwie dostępu do danych), a następnie rejestrowanie dalszych nieprzechwyconych wyjątków na najwyższym poziomie. Wymagałoby to jednak ode mnie złapania i ponownego zarejestrowania każdego wyjątku na najwyższym poziomie, ponieważ nie mogę odróżnić błędów, które już zostały zarejestrowane \ obsługiwane od tych, które nie zostały zarejestrowane.
Oczywiście jest to problem występujący w większości aplikacji, dlatego musi istnieć standardowe rozwiązanie tego problemu, w wyniku którego wyjątki są wychwytywane u źródła i logowane raz; jednak po prostu nie widzę, jak to zrobić.
Uwaga: tytuł tego pytania jest bardzo podobny do „ Rejestrowanie wyjątków w aplikacji wielowarstwowej” ”, jednak odpowiedzi w tym poście nie zawierają szczegółów i nie są wystarczające, aby odpowiedzieć na moje pytanie.
The easiest solution would be to implement the logging at the top level
- Zrób to. Rejestrowanie wyjątków u źródła nie jest dobrym pomysłem, a każda aplikacja, z którą się zetknąłem, była PITA do debugowania. Osoba odpowiedzialna za wywołanie wyjątku powinna ponosić odpowiedzialność.
try{ ... } catch(Exception ex) { Log(ex); }
spowoduje zapisanie tego samego wyjątku w każdej warstwie. (Wydaje się również, że złym zwyczajem jest wychwytywanie każdego wyjątku na każdej warstwie w bazie kodu.)