Есть ли в Твиттер-фьючерсе эквивалент Await.result без метаний? - PullRequest
0 голосов
/ 18 октября 2018

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, который предотвращает это.)

...