使用Akka actor处理异常

时间:2015-04-15 06:25:16

标签: scala exception-handling akka

子actor中的函数生成的异常是否必须由子actor明确地捕获和抛出,或者supervisor策略指令(escalate)是否负责将生成的异常渗透到幕后的supervisor actor? / p>

我的主管策略:

  override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 minute) {
  case _: ArithmeticException      ⇒ Resume
  case _: NullPointerException     ⇒ Restart
  case _: IllegalArgumentException ⇒ Stop
  case _: IOException              ⇒ Stop
  case _: Exception                ⇒ Restart
}   

子actor中的一些操作可能会抛出IOException。我应该在子actor中放一个try catch块来捕获它然后抛出它以便主管可以捕获它吗?或者akka会在幕后处理它吗?

2 个答案:

答案 0 :(得分:1)

如果您没有任何损失,请让它崩溃。它应该是默认行为。但遗憾的是,有时您需要分配资源,或者您需要了解出现问题时所发生的事情。

就我个人而言,我通常会捕获所有关于在创建端点或Web应用程序时发生的事情的例外情况。

答案 1 :(得分:1)

大多数情况下,最好“让它崩溃”并根据您的情况选择正确的主管策略。如果要保持内部状态,只需选择简历即可。在重新启动之前清理资源可以在preRestart方法中完成。

Akka有处理异常的复杂方法,为什么不使用它们?没有理由捕获异常然后再抛出它。