Ближайший эквивалент finally
равен whenComplete
.Как и handle
, он принимает функцию, получающую либо значение результата, либо бросаемое значение, но он не предоставляет значение результата замещения, а новый этап завершения не изменит результат, как finally
.
So
static int decode(String s) {
try {
return Integer.parseInt(s);
}
finally {
System.out.println("finally action");
}
}
эквивалентно
static int decode1(String s) {
return CompletableFuture.completedFuture(s)
.thenApply(Integer::parseInt)
.whenComplete((i,t) -> System.out.println("finally action"))
.join();
}
Так что при использовании с
for(String s: Arrays.asList("1234", "foo bar")) try {
System.out.println("decoded: "+decode(s));
} catch(Exception ex) {
System.out.println("decoding "+s+" failed with "+ex);
}
первый вариант печатает
finally action
decoded: 1234
finally action
decoding foo bar failed with java.lang.NumberFormatException: For input string: "foo bar"
и последний печатает
finally action
decoded: 1234
finally action
decoding foo bar failed with java.util.concurrent.CompletionException: java.lang.NumberFormatException: For input string: "foo bar"
Общим для обоих является то, что исключение, сгенерированное в действии finally, заменит исходный результат, затеняя исключение, если блок try / предыдущий этап завершен исключительно.