2014-03-03 51 views

回答

4

一种可能的方法:

  1. 定义一个新的运行时异常的异常类能够封装故障消息。
  2. 在受监督的演员。捕捉异常并用错误的消息抛出上面定义的异常。
  3. 在主管策略中,捕获新的异常类型并访问消息。

例如:

// The new exception type 
case class MessageException( 
    akkaMessage: Any, 
    originalException: Throwable 
) extends RuntimeException("Exception due to message") 

// In the supervised actor 
def receive = { 
    case msg => try{ process(msg) } catch { 
    case t => throw MessageException(msg,t) 
    } 
} 

// In the supervisor 
override val supervisorStrategy = 
    OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { 
    case MessageException(msg,t) => //decide what to do 
    } 
+2

是的,我能做到这一点,但在监督的演员我再从catch块发送失败消息给监督员。按照“Akka in Action”中的建议,我想摆脱受监督演员的尝试和捕获 – boneash

+0

这里try catch本身没有逻辑,它只是向异常添加更多数据。真正的错误处理仍然在管理程序中完成,try/catch代码可以在一个方法中被抽象化。 – paradigmatic

+0

范式的方法听起来对我来说是逻辑的,谢谢你。 –