我遇到了返回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
失败)。
这是好习惯吗?有没有更好的方法来处理来自这样的函数的错误?
答案 0 :(得分:5)
Future
最终用于返回某些内容,但实际发生时却不清楚。
来自.NET的观点(我们有Task
):如果请求明显无效(例如格式错误的URL),则应抛出异常。在实际发出Web请求之前,您已经知道了这一点,因此无需延迟异常。
另一方面,如果服务器已关闭(超时?)或服务器返回客户端无法理解的内容:这可以而且必须在以后处理,因为响应不能直接在打电话。我们可以阻止,直到响应可用,但这会使Future
无用。
我认为与早期退出相比,这是最佳选择。编程风格。