Zastanawia mnie jakie jest prawidłowe podejście przy zapisywaniu komunikatu błędów do pliku. Rozważmy taką sytuacje: moja aplikacja to klient który odzywa się do serwisu.
Klient
public class HomeController : Controller
try
{
bool result = reportService.UpdateReportFor(userId)
if (!result)
throw new Exception();
}
catch (Exception ex)
{
ClientLogger.Error("Index Error", ex);
}
Serwis
public class ReportService
UpdateReportFor(int userId)
{
try
{
//...
}
catch (Exception ex)
{
ServiceLogger.Error("UpdateReportFor Error", ex);
return false;
}
}
Ja bym to zrobił tak:
Leci wyjątek w ReportService
mam w nim try catch, łapę i loguje błąd i zwracam z metody coś co informuje mnie że coś poszło nie tak np. -1. W kliencie sprawdzam że jeżeli wynik == -1 to rzucam kolejny wyjątek. W ten sposób logują mi się dwa błędy jeden z serwisu a drugi z klienta. Plus tego jest taki że mogę sobie złożyć to w całość i widzę że błąd z klienta jest powiązany z błędem z serwisu. Minus tego jest taki że nie mam od razu całej ścieżki.
Zastanawia mnie teraz czy to podejście jest prawidłowe. Przy założeniu że zapisuje logi do tego samego pliku to znalezienie metody która wywołuje metodę na niższym poziomie (ReportService) nie będzie trudne.
Co natomiast w przypadku jak błędy z klienta zapisuje w innym pliku niż błędy z serwisów ? Będę teraz musiał przeglądać dodatkowe pliki i sprawdzać która metoda kliencka (z którego klienta) wywołała metodę w serwisie, a to moim zdaniem jest słabe i czasochłonne.
Jednakże najbardziej przyjazna dla mnie wydaje się metoda gdzie łapę wyjątek dopiero na wyższym poziomie (klient) bo wtedy od razu mam całą ścieżkę błędu. Natomiast nie wydaje mi się żeby to było poprawne.
-
Co w przypadku jak mam jeszcze dodatkową warstwę repozytoriów. Tzn serwis korzysta z repozytoriów i w repo leci mi błąd. Gdzie robić try catche i jak to obsłużyć?
-
Lepiej zapisywać logi do różnych plików np 1 plik = 1 serwis, czy jak to możliwe trzymać je w jednym.