【问题标题】:Scala Future.failed throws the exception passed to itScala Future.failed 抛出传递给它的异常
【发布时间】:2016-07-21 13:20:27
【问题描述】:

我正在使用构造函数 Future.failed 创建一个失败的未来,但是当我认为它不应该时,失败的未来仍然会抛出异常。

方法 session.loadAll 确实会引发异常。

我也在使用 Play 框架

它甚至使用 try-catch 块发生

【问题讨论】:

  • 我完全不知道你问了什么。方法loadAll 抛出异常,OK,你的模式匹配捕获它,OK,然后你返回另一个Future.failed 包装一个新的Exception,OK。有什么问题?另外,截图是怎么回事?
  • @slouc 我的意图是像你说的那样返回一个包装异常的未来,问题是不是返回未来,而是抛出异常。这就是我试图用图像展示的内容。应用程序不应该崩溃,因为没有抛出异常(或者,至少,这就是我想要的,通过在将来包装异常)
  • 哦,我明白了。但是Future.failed(new Exception()) 部分绝对不是引发异常的部分。别的东西是。也许消耗getThings 的结果的部分并不期望失败的未来(尽管我不确定为什么编译器会在这种情况下在第44 行显示异常)。我的截图评论说你应该总是发布代码 sn-ps,而不是图像。
  • @slouc 你说得对,问题出在消费者身上

标签: scala exception-handling future throws


【解决方案1】:

我认为Future.failed 没有抛出异常。看起来是这样,因为堆栈跟踪是在创建异常的地方生成的。

因此,如果您使用像 Await.result 这样的方法,或者假设未来成功的其他方法,您将看到重新抛出异常,但堆栈跟踪会使它看起来好像被扔进了Future.failed。

【讨论】:

  • Await.result 通常不鼓励使用,因为它是一个阻塞调用。如果不需要阻塞,Future.onComplete 或Future.onFailure 将遵循异步模式并具有相同或更好的性能。 docs.scala-lang.org/overviews/core/futures.html 进一步解释了为什么这是一个坏主意
【解决方案2】:

首先,我不太清楚你为什么在这里使用未来,因为这些看起来不像异步调用。

但是,要回答您的问题,我不完全确定这里发生了什么,但看起来您需要处理异常。未来的消费者应该使用 Future.onComplete 和模式匹配失败类型,或 Future.onFailure 和模式匹配 Throwable 类型。

关于 Future 的 Scala 文档:http://docs.scala-lang.org/overviews/core/futures.html

【讨论】:

  • 你说得对,问题出在消费者身上,它没有处理异常
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2011-01-28
  • 1970-01-01
  • 2012-03-25
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多