2015-01-16 16 views
5

Podczas korzystania z adnotacji Spring @Async abstrakcja jest nieszczelna, jeśli chodzi o (zaznaczone) wyjątki w klauzuli throws tej metody. Kompilator zmusi wywołującego do obsługi wyjątku, ale w rzeczywistości wywołujący nigdy nie zobaczy wyjątków generowanych przez metodę @Async. Zamiast tego, w zależności od implementacji, będzie on obsługiwany przez & logowany przez Spring, lub przekazywany do skonfigurowanej przez użytkownika obsługi wyjątków, lub produkowany, gdy wywoływana jest Future#get() przy zwracanej wartości.Abstrakcja Spring @ Synchronizacja jest nieszczelna w odniesieniu do obsługi wyjątków

Dlatego też formułuję opinię, że metody z reguły nie powinny zrzucać sprawdzonych wyjątków. Zamiast tego powinny zawijać wszystkie zaznaczone wyjątki w typach RuntimeException, aby nie występować klauzula throws.

Czy to jest dokładna ocena? Czy istnieje jakieś narzędzie lub programowanie, które naprawia wyciek? Czy ktokolwiek zdaje sobie sprawę z tego, co myślą o tym wiosenni programiści, lub czy są jakieś plany poprawy sytuacji? Dzięki!

prawdopodobnie związane: Spring Async method hides exceptions

+1

Generalnie Wiosna preferuje niesprawdzonych wyjątki (spojrzeć na tłumaczenie wyjątków w Spring danych), a to naprawdę nie jest to możliwe dla metoda asynchroniczna do rzucania czegokolwiek (właśnie dlatego 'Future' opakowuje wyjątki). – chrylis

+0

Prawdziwy problem zaczyna się, gdy metoda @ Async'ed nie zwraca żadnej wartości. Pojawiają się ciekawe rzeczy;) –

+0

Co ciekawego konkretnie, R4J? – Jukka

Odpowiedz

2

Twoja ocena jest prawdopodobnie poprawne.

Teraz, jeśli chcesz obsługiwać wspomniany wyjątek, tylko to zrobić:

@Async 
void mangle() { 
    try { 
     doMangle(); 
    } catch (YourCheckedException e) { 
     // Handle it 
    } 
} 

void doMangle() throws YourCheckedException { 
    ... 
} 
Powiązane problemy