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

时间:2015-11-19 11:36:13

标签: scala

我遇到了返回Future但又立即抛出异常的函数。例如:

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

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

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

我注意到播放框架中的WSClient执行此操作(如果URL格式错误,则抛出异常,如果HTTP请求失败,则返回Future失败)。

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

1 个答案:

答案 0 :(得分:5)

Future最终用于返回某些内容,但实际发生时却不清楚。

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

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

我认为与早期退出相比,这是最佳选择。编程风格。