简体   繁体   中英

CompletableFuture exceptional handler chain

Is it possible to make exceptional handlers in chain with ComplatableFuture? For example: I have this code, the idea is that if location service methods throws an error, make a generic call to findClosest method (with no params). So basically, I want to return List <Closest> form either of these methods. This works ok. But on the external code, I need to fire an event in case the method call was generic (in case locationService fail).

@Async
@Override
public CompletionStage<List<Closest>> getClosestByZip(final String zip) {

    return locationService.getCoordinates(zip)
            .handle((c, ex) -> ex == null ? closestService.findClosest(c) : closestService.findClosest())
            .thenCompose(list -> list);
}

In the test, the exceptional section never executed, cause the future appears to be completed successfully.

CompletableFuture<List<Closest>> closest = distanceService.getClosestByZip("111111")
            .exceptionally(ex -> {
                System.out.println("From exceptionally");
                return null;
            })
            .toCompletableFuture();


    try {
        List<Closest> list = closest.get();
        Assert.assertEquals(2, list.size());
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
        Assert.fail("Exception was not caught");
    }

How is it possible to handle this situation?

Please check if this is helpful.

public class CompleteableFutureEx {

        public static void main(String[] args) throws Throwable {
            try {
                test(-1);
            } catch (ArithmeticException e) {
                System.out.println("Oops! We have an ArithmeticException");
            } 
            catch (IllegalArgumentException e) {
                System.out.println("Oops! We have an IllegalArgumentException");
            }
            catch (Exception e) {
                System.out.println("Oops! We have an Exception ");

            }
        }

        public static void test(int age) throws Throwable {

            try {
                CompletableFuture<String> maturityFuture = CompletableFuture.supplyAsync(() -> {
                    //ArithmeticException
                    //int age1 = age/0;
                    if (age < 0) {
                        throw new IllegalArgumentException("Age can not be negative");
                    }
                    if (age > 18) {
                        return "Adult";
                    } else {
                        return "Child";
                    }
                });
                maturityFuture.join();
            }catch (CompletionException ce) {
                throw ce.getCause();
            } 

        }

    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM