【问题标题】:Akka Futures ExceptionsAkka 期货例外
【发布时间】:2013-04-12 07:21:04
【问题描述】:

当未来的演员抛出异常时会发生什么?

根据http://doc.akka.io/docs/akka/snapshot/scala/futures.html 的 Akka 文档:

Actor 或 Dispatcher 是否正在完成任务并不重要 Future,如果捕获到异常,Future 将包含它 的有效结果。如果 Future 确实包含异常,则调用 Await.result 会导致它再次被抛出以便可以处理 正确。

我不确定这是我在运行这段代码时看到的:

  class Worker extends Actor {
    def receive = {
      case i: Int => throw new RuntimeException
    }         
  }

  implicit val system = ActorSystem("MySystem")
  val worker = system.actorOf(Props(new Worker), name="worker")
  implicit val timeout = Timeout(5 minutes)
  val future = worker ? 0
  val res = Await.result(future, 10 seconds)

根据文档,Await.result 应该再次抛出异常,但我得到的是 TimeoutException!有人可以澄清一下吗?

【问题讨论】:

    标签: scala exception exception-handling akka future


    【解决方案1】:

    对于演员,您需要捕获异常和return it as a failure status。现在你没有向发件人返回任何东西,所以你得到一个超时异常:

    class Worker extends Actor {
      def receive = {
        case i: Int => {
          try {
            throw new RuntimeException
            sender ! "Some good result"
          } catch {
            case e: Exception =>
              sender ! akka.actor.Status.Failure(e) // Alert the sender of the failure
              throw e // Alert any supervisor actor of the failure
          }
        }
      }
    }
    

    Futures 可以更优雅地处理这个问题,因为它们总是发送结果,而 Actor 不发送(这会给你与上面相同的结果):

      val future = Future {
        throw new RuntimeException
      }
    

    【讨论】:

    • 感谢您的澄清。您提供的链接也很好地阐明了参与者和期货之间的互动。我想知道,根据您的理解,您认为我上面关于期货的参考在澄清这种关系方面是否足够准确?
    • 不,我希望文档更好。问题是演员不应该向发送者返回任何东西,所以你永远不知道询问是否应该完成。如果可以更好地记录这一点,或者如果刚刚消除了询问并实现了完全类型化的发送接收参与者机制,那就太好了。无类型参与者的模糊性只会因无类型和完全未知的响应可能性的模糊性而变得更糟。
    • 这有必要吗? throw e // Alert any supervisor actor of the failure。假设错误是由于登录参与者的“密码不正确”造成的。会抛出帮助主管吗?
    • @Jus12 取决于您的用例;在您描述的情况下,实际上可能在大多数情况下,主管不太可能希望看到这种失败。我认为 Noah 只是在说明如何在需要时执行此操作,并指出默认情况下不会发生。
    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多