2015-04-15 126 views
3

是否由子actor中的函数生成的异常必须由子actor显式捕获和抛出,或者是否由supervisor策略指令(escalate)负责将生成的异常过滤到主管actor幕后?Akka actor的异常处理

我的导师策略:

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

以及一些儿童演员中的操作可能可能抛出IOException。我是否应该在儿童演员中放置一个try catch块来抓住它,然后扔掉它以便主管能够抓住它?或者阿卡会在幕后照顾它?

回答

1

如果你没有任何损失,让它崩溃。它应该是默认行为。但不幸的是,有时您需要分配资源,或者需要了解事情出错时发生的情况。

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

1

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

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

+0

但是,如果不抛弃它,那么例外情况是否会上升到主管级别,以便适当的主管策略可以应用到它? –

+0

@PaulThomas是的,异常将被抛出完全相同,所以它将被处理完全一样。 – Quizzie