【问题标题】:Is try catch in actors always bad practice?在演员中尝试捕捉总是不好的做法吗?
【发布时间】:2015-08-07 15:03:08
【问题描述】:

我知道演员中的异常处理通常应该使用主管策略来完成。但这对所有情况都有效吗?

示例

  • 有一个演员是某种数据库。
  • 有几个源 Actor 可以将数据添加到数据库 Actor。
  • 这些演员的父子关系未知。
  • 要将数据添加到数据库参与者,源参与者必须在数据库参与者中注册。
  • 如果未注册的源参与者尝试向数据库添加数据,则会引发异常。

如果我严格遵循 akka Actor 的错误处理策略,那么监督 Actor 将不得不处理这种情况。

我更愿意在数据库参与者中捕获异常并向源参与者发送一条消息,指出出现问题。然后源参与者可以做出反应(注册到数据库并重试)。

这是一个好习惯吗?还是整个演员设置错误?如果首选主管策略,应该如何实施?

【问题讨论】:

  • 为什么在这种情况下需要抛出异常?您可以发送正确的答案或发布正确的事件
  • 数据库参与者使用的底层数据库引发异常。因此,要么捕获异常并发送消息,要么使用主管策略。
  • 但您声称可以检查 smb 是否直接在 db actor 持有的寄存器列表中注册。所以如果不是 - 不要向 db 发送任何请求,而只是用“未授权”消息等响应。
  • 数据库不能,但我可以将它存储在演员本身。但这与 try catch 并没有什么不同,除了语法。所以只有当意外发生时才使用监督演员?
  • @hami 我同意你的看法。我的经验法则是这样的:捕获预期的异常并尽可能处理它们。如果不可能或异常是意料之外的,让actor崩溃并让supervisor处理。

标签: exception-handling akka actor


【解决方案1】:

捕获异常并在您认为合适时将其转化为响应是非常好的。我建议使用 Scala 的 Try,如:

Try(dangerousOperation()) match {
  case Success(res) => sender() ! res
  case Failure(ex)  => sender() ! UnableToStoreThingy("reasons...", ex)
}

或者类似的东西(你也可以try.failed.map { ex => doThings(ex) }),取决于你的风格偏好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多