我需要调用可能或不能及时返回结果的服务.我希望能够写作
val result = runWithTimeout(5000, valReturnedOnTimeout) { service.fetch }
Run Code Online (Sandbox Code Playgroud)
是否有一个标准函数可以完成这项工作 - 比如Ruby的超时?
我试图重现这个问题如何获得Scala Future中抛出的异常?使用scala.concurrent.Future和我期待被吞下的例外,但它似乎没有发生.任何解释?
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
def runWithTimeout[T](timeoutMs: Long)(f: => Future[T]) : T = {
Await.result(f, timeoutMs.millis)
}
runWithTimeout(50) { Future { "result" } }
runWithTimeout(50) { Future { throw new Exception("deliberate") } }
Run Code Online (Sandbox Code Playgroud) 如果Scala未来失败,并且没有"观察"失败的延续(或者唯一的延续使用map/flatMap并且在失败的情况下不运行),那么错误就不会被检测到.我希望至少记录这些错误,所以我可以找到错误.
我使用术语"观察到的错误",因为在.Net Tasks中,当GC收集Task对象时,有机会捕获"未观察到的任务异常".类似地,使用同步方法,可以记录终止线程的未捕获异常.
在Scala期货中,"观察"失败意味着某些延续或其他代码会在未来处置之前读取存储在未来值中的Exception.我知道最终确定不是确定性的或可靠的,并且可能这就是为什么它不能用于捕获未处理的错误,尽管.Net确实成功地做到了这一点.
有没有办法在Scala中实现这一目标?如果没有,我应该如何组织我的代码以防止未处理的错误错误?
今天我andThen checkResult附加了各种未来.但是很难知道何时使用它以及何时不使用:如果库方法返回Future,它不应该checkResult并记录错误本身,因为库用户可能会处理失败,因此责任落在用户身上.当我编辑代码时,我有时需要添加检查,有时需要删除它们,这种手动管理肯定是错误的.
有什么区别
try {
Future . map { }
} catch {}
Run Code Online (Sandbox Code Playgroud)
和
Future.map {} recover {}
Run Code Online (Sandbox Code Playgroud)
它们不是同一个东西吗?try catch 如何处理 futures 中的异常与恢复方法如何处理。