Jakaś metoda myMethod
wywołuje kilka równoległych wykonywania i oczekuje na ich zakończenie.
Te równoległe wykonywanie może zakończyć się wyjątkami. Więc myMethod
dostaje listę wyjątków.
Chcę przekazać listę wyjątków jako główną przyczynę, ale główną przyczyną może być tylko jeden wyjątek. Jasne, że mogę stworzyć własny wyjątek, aby osiągnąć to, czego chcę, ale chcę wiedzieć, czy Java, Spring lub Spring Batch ma coś takiego od razu po wyjęciu z pudełka.
AggregateException
który zawiera listę wyjątków. Ten pomysł powinien dotyczyć także Javy.Odpowiedzi:
Nie jestem pewien, czy to zrobię (chociaż biorąc pod uwagę JavaDoc, nie mogę powiedzieć, dlaczego się waham), ale istnieje lista wyłączonych wyjątków
Throwable
, do których można dodać za pośrednictwemaddSuppressed
. Wydaje się, że JavaDoc nie mówi, że jest to przeznaczone wyłącznie dla JVM w try-with-resources:Zwróć uwagę na ostatni akapit, który wydaje się pasować do twojego przypadku.
źródło
Wyjątki i ich przyczyny są zawsze tylko 1: 1: możesz zgłosić jeden wyjątek, a każdy wyjątek może mieć tylko jeden przyczynę (która znowu może mieć jedną przyczynę ...).
Można to uznać za wadę projektową, zwłaszcza gdy rozważa się zachowanie wielowątkowe zgodnie z opisem.
To jeden z powodów, dla których dodano Javę 7
addSuppressed
do wrzutu, który może w zasadzie dołączyć dowolną liczbę wyjątków do jednego innego (drugą główną motywacją było wypróbowanie zasobów, które wymagały sposobu obsługi wyjątków w bloku ostatecznie bez dyskretnego upuszczania) im).Zasadniczo, gdy masz 1 wyjątek powodujący niepowodzenie procesu, dodajesz go jako przyczynę wyjątku wyższego poziomu, a jeśli masz więcej, dodajesz je do oryginalnego za pomocą
addSuppressed
. Chodzi o to, że ten pierwszy wyjątek „tłumił” pozostałe, stając się członkiem „prawdziwego łańcucha wyjątków”.Przykładowy kod:
źródło