2014-03-03 48 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

範式的方法聽起來對我來說是邏輯的,謝謝你。 –