com.twitter.util.Await.result (Awaitable) создает исключение.
Это необходимо, поскольку вызов Await.result для исключительного будущего должен вызвать исключение, содержащееся в будущем.
Но если я передал полную функцию в Future.handle или Future.rescue,Я знаю, что не должно появляться никаких нефатальных исключений.
// Scala code
val s = Await.result(futureOfString.handle { case _ => "some default" })
Когда Await.result вызывается из Java, я должен либо поместить его в блок try, либо перечислить исключение впредложение throws вызывающего метода и распространение этого проверенного Exception вверх по стеку вызовов.
// Java code
// Add throws clause, and add it to every caller too
String someMethod(Future<String> future) throws Exception {
return Await.result(future.handle(func(e -> "default")));
}
Или,
// Java code
// convert Exception to unchecked
String someMethod(Future<String> future) {
try {
return Await.result(future).handle(func(e -> "default"));
} catch(Exception e) {
throw new RuntimeException(e);
}
}
Так что я ожидаю увидеть что-то в утилитарной библиотеке Twitter, котораяпреобразует проверенное исключение в непроверенное исключение, например:
// Scala code
silentResult[T](Future[T] future) : T = try {
Await.result(future)
} catch {
case e: Exception => throw new RuntimeException(e);
}
Поскольку я не вижу ничего похожего на гипотетический silentResult, я предполагаю, что есть лучший способ сделать это?
(Да, я вообще не должен был ожидать, я должен просто возвращать будущее, но в этом случае у меня есть установленный API, который предотвращает это.)