返回Future [A]的函数是否会抛出异常?

Tom*_*igh 8 scala

我遇到了返回的函数,Future但也立即抛出异常.例如这样:

def func(): Future[String] {
  if (something) {
     // this
     Future.failed(new RuntimeException("test"))
  } else {
     // and this
     throw new RuntimeException("test")
  }
}
Run Code Online (Sandbox Code Playgroud)

这种行为对调用者来说似乎很烦人,因为你必须做这样的事情来捕获这两个错误:

try {
  func() recover {
    case e: Exception => handleError(e)
  }
} catch {
  case e: Exception => Future.successful(handleError(e)) //or Future.failed etc
}
Run Code Online (Sandbox Code Playgroud)

我注意到WSClientin play框架执行此操作(如果URL格式错误则抛出异常,并且Future如果HTTP请求失败则返回失败).

这是好习惯吗?有没有更好的方法来处理来自这样的函数的错误?

Car*_*iel 5

Future 用于最终返回某些东西,但实际发生时却不清楚.

来自.NET的观点(我们有Task):如果请求明显无效(例如格式错误的URL),则应抛出异常.在实际发出Web请求之前,您已经知道了这一点,因此无需延迟异常.

另一方面,如果服务器关闭(超时?)或服务器返回客户端不理解的内容:这可以而且必须在以后处理,因为在进行调用时响应不可直接使用.我们可以阻止,直到响应可用,但这将使Future无用.

我认为这与"退出早期"编程风格相比是最好的.

  • 这在Scala中并不是真正的惯用语 - 任何可恢复的错误都应该在将来失败,不管它们何时发生都不会抛出. (4认同)