子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会在幕后处理它吗?
答案 0 :(得分:1)
如果您没有任何损失,请让它崩溃。它应该是默认行为。但遗憾的是,有时您需要分配资源,或者您需要了解出现问题时所发生的事情。
就我个人而言,我通常会捕获所有关于在创建端点或Web应用程序时发生的事情的例外情况。
答案 1 :(得分:1)
大多数情况下,最好“让它崩溃”并根据您的情况选择正确的主管策略。如果要保持内部状态,只需选择简历即可。在重新启动之前清理资源可以在preRestart方法中完成。
Akka有处理异常的复杂方法,为什么不使用它们?没有理由捕获异常然后再抛出它。