使用Akka actors处理异常情况

3
一个子Actor中的函数生成的异常需要被子Actor显式地捕获和抛出,还是由监督策略指令(升级)在后台处理并传播生成的异常到监督Actor中?请注意保留HTML标记。
我的监督策略:
  override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 minute) {
  case _: ArithmeticExceptionResume
  case _: NullPointerExceptionRestart
  case _: IllegalArgumentExceptionStop
  case _: IOExceptionStop
  case _: ExceptionRestart
}   

在子Actor中的某些操作可能会抛出IOException异常。我应该在子Actor中放置try catch块来捕获它然后再抛出,使得父Actor可以捕获吗?或者Akka会在幕后处理它?

2个回答

1
如果你没有什么可以失去的,就让它崩溃。这应该是默认行为。但不幸的是,有时你需要分配资源或者需要了解当事情出错时发生了什么信息。
个人而言,我通常捕获所有我想要通知的异常,当我创建端点或Web应用程序时。

0
大多数情况下,最好让程序“崩溃”,并选择适合您情况的正确监督策略。如果您想保留内部状态,请选择恢复。在重新启动之前清理资源可以在preRestart方法中完成。
Akka有处理异常的复杂方式,为什么不使用它们呢?没有理由捕获异常然后再次抛出。

但是如果不抛出它,异常会到达主管级别,以便可以将适当的主管策略应用于它吗? - user773366
@PaulThomas 是的,异常会被抛出完全相同,因此处理方式也完全相同。 - Quizzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接