6 Haziran 2023 Salı

CompletableFuture.supplyAsync metodu İle Exception Dönmek

Exception Fırlatmak
2 tane yöntem var
1 - Eğer supplyAsync() metodu içinde checked exception fırlatılıyorsa bu exception'ı yakalayıp CompletionException olarak tekrar fırlatmak gerekiyor.
2. completeExceptionally() metodu çağrılır

1. CompletionException Fırlatmak
Örnek
Şöyle yaparız
// Some code
CompletableFuture<A> future= CompletableFuture.supplyAsync(() -> {
  try {
    return someObj.someFunc(); 
  }
  catch(ServerException ex) {
    throw new CompletionException(ex);
 }
});
Daha sonra future.get() veya future.join() çağrılarında bu checked exception'a erişme imkanı var.

2. completeExcepitonally() Çağrısı Yapmak
Örnek
Şöyle yaparız.
public static CompletableFuture<Integer> converter(String convertMe) {
  CompletableFuture<Integer> future = new CompletableFuture<>();
    try {
      future.complete(Integer.parseInt(convertMe));
    } catch (Exception ex) {
      future.completeExceptionally(ex);
    }
    return future;
}
Exception Olduğunu Anlamak ve Erişmek
1. Future.join()
2. Future.get()
3. supplyAsynch + handle()
4. supplyAsynch + exceptionally()
5. supplyAsynch + whenComplete ()

Future.join() İle Checked Exception'a Erişmek
Örnek 
Şöyle yaparız. Burada belki de en güzeli sadece Exception'ı yakalamak ta olabilir. Böylece Supplier unchecked exception fırlatsa bile yakalanabilir.
CompletableFuture<A> future = ...;

A resultOfA;
try {
  resultOfA = future.join();
}
catch(CompletionException ex) {
  ...
}
Future.get() İle Checked Exception'a Erişmek
Örnek

Şöyle yaparız. Burada belki de en güzeli sadece Exception'ı yakalamak ta olabilir. Böylece Supplier unchecked exception fırlatsa bile yakalanabilir.
CompletableFuture<A> future = ...;

A resultOfA;
try {
  resultOfA = future.get();
}
catch(Exception ex) {
  ...
}
supplyAsynch metodu ve exceptionally
Burada future sonucunda exception görmek yerine exception'ı temsil eden bir sonuç döndürülür.
3 tane yöntem var.
- handle() metodu
- exceptionally() metodu
- whenComplete metodu()

handle metodu
Şöyle yaparız
CompletableFuture correctHandler = CompletableFuture.supplyAsync(() -> "A")
  .thenApply(Integer::parseInt)
  .handle((result, ex) -> {
    if (null != ex) {
      ex.printStackTrace();
      return 0;
    } else {
      System.out.println("HANDLING " + result);
      return result;
    }
  })
  .thenAcceptAsync(s -> {
    System.out.println("CORRECT: " + s);
});
exceptionally metodu
Örnek
Şöyle yaparız.
CompletableFuture parser = CompletableFuture.supplyAsync(() -> "1")
  .thenApply(Integer::parseInt)
  .exceptionally(t -> {
    t.printStackTrace();
    return 0;
  })
  .thenAcceptAsync(s -> System.out.println("CORRECT value: " + s));
whenComplete metodu
Örnek
Şöyle yaparız.
CompletableFuture correctHandler2 = CompletableFuture.supplyAsync(() -> "A")
  .thenApply(Integer::parseInt)
  .whenComplete((result, ex) -> {
    if (null != ex) {
      ex.printStackTrace();
    }
  })
  .thenAcceptAsync(s -> {
    System.out.println("When Complete: " + s);
});

Hiç yorum yok:

Yorum Gönder