Kilka lat temu, w poprzedniej firmie pracowałem z człowiekiem, który miał "osobliwe" podejście do czystego kodu, w sensie miał zawsze mnóstwo uwag do czyjegoś kodu, ale do swojego nigdy. W tym projekcie miałem zintegrować istniejącą aplikację z zewnętrznym komponentem do mapowania danych z pewnego sekretnego formatu do XML. Ten komponent dostarczany był jako wygenerowana osobna aplikacja Java jako folder z klasami, który po prostu wrzucałem do src/main/java
i można było ten kod wywołać statyczną metodą (pomijam na razie czy to było dobre rozwiązanie - szczeniakiem byłem).
Problem był jednak taki, że ten komponent często się wywalał na błędnych danych wejściowych, nad którymi nie mieliśmy kontroli, a klient bardzo chciał użyć tego rozwiązania. Więc wymyśliłem ficzer, że cały proces mapowania danych (wraz z ewentualnymi błędami) będę zapisywał do pliku i wrzucał go na udział sieciowy, gdzie klient ma dostęp. Ale potrzebowałem mieć loga wszystkich błędów, żeby udowodnić klientowi że błędy są z zewnętrznego komponentu a nie od nas. Więc napisałem następujący kod:
public void doTheMappingJob() {
try {
externalComponent.doTheJob(params, toFileLogger);
toFileLogger.write("Everything went fine");
catch (Exception e) {
toFileLogger.write("That mapping component screwed up again", e.getStackTrace());
}
toFileLogger.flushToStorage();
}
To działało dokładnie tak, jak chciałem. Ale przy review oczywiście dostałem komentarz
You should not catch Exception.
Próbowałem tłumaczyć mu, że to jest granica nasz kod - czyjś kod, że musimy mieć observability na prodzie nawet kosztem łamania pewnych zasad, ale nie dało się go przekonać. Ostatecznie odpuścił i kod trafił na proda, gdzie działał fajnie. Ale czy moje rozwiązanie i tok rozumowania jest poprawny? Jak spełnilibyście takie wymagania bez catch Exception
?