Załóżmy, że mam metodę, która generuje wyjątek. Kod rzucający wyjątki znajduje się w bibliotece innej firmy, która uzyskuje dostęp do usługi zewnętrznej. Mam kilka zajęć, które wykonują dużo pracy z usługami zewnętrznymi i istnieje wiele przypadków obsługi wyjątków, aby poradzić sobie z potencjalnymi problemami. Kwestia, którą uderzam, polega na tym, że mogę mieć wiele wyjątków, ale mogę wykonać tylko jedną z kilku akcji, jeśli taka istnieje, i jest tam mnóstwo bloków try/catch. Typ wyjątku może nie być odpowiedni, lub różne metody mogą powodować ten sam typ wyjątku, ale należy podjąć różne działania w zależności od metody jego wyrzucania.Stosowanie adnotacji do obsługi wyjątków?
Czego szukam to adnotacja, która może zastąpić try/catch i po prostu dyktować zachowanie, które należy podjąć, gdy istnieje wyjątek w tej metodzie. Wiem, że Spring ApsectJ może robić tego rodzaju rzeczy, ale obecnie nie jestem w stanie łatwo dodać nowych zależności lub zmodyfikować pom, aby dostosować istniejące. W związku z tym mam nadzieję, że można to osiągnąć za pomocą niestandardowej adnotacji. Na przykład:
@Catcher(action=SomeEnum.SOME_ACTION)
public void doSomething(ServiceObj obj) throws SomeException {
ExternalService.makeThingsHappen(obj);
}
Zakładam, że osobna klasa poradzi sobie oczywiście z wyjątkami. Dodatkową trudnością jest to, że potrzebuję ServiceObj, który również został przekazany. Jeśli makeThingsHappen() nie powiedzie się, może potrzebować obiektu obj, aby wykonać dodatkowe akcje. Zmienna akcji powie klasie handler, co zrobić z obiektem.
Czy można to zrobić bez surowego mruknięcia, czy mam nadzieję na coś, co może nie istnieć?
Adnotacje nie dodają żadnych zachowań na własną rękę. Są to metadane. Musisz udostępnić analizator składni, który może dodać to zachowanie, jeśli je znajdzie. –
Nazwałbym to drobne muckery; może być obsługiwany trywialnie z AOP lub manipulacją bajtowym kodem. –