2016-06-13 53 views
4

下面的函數響應調用演員:捕獲異常作爲一個演員的阿卡

def read() = { 

    val system = ActorSystem(Constant.actorSystem) 
    val manageData = system.actorOf(Props[ManageData], name = "theactor") 

    val num = -1 
    implicit val timeout = Timeout(60 seconds) 
    val future = manageData ? num 
    val result = Await.result(future, timeout.duration) 
} 

manageData子進程拋出一個異常:

throw new Exception("Negative number") 

如何捕捉它read()

+3

拋出異常將重啓演員,讓父母演員和做童星所有的工作,並通過覆蓋在其監督策略處理由兒童演員在其父引發的異常。 – curious

+0

那麼從演員向主叫方返回錯誤的最佳做法是什麼? – ps0604

+0

通過發送消息或通過在該演員的父母處理此異常並相應地監督它,將信息傳遞給發件人。 – curious

回答

0

這是一個古老的問題,但我留下了處理它的方式。

如果異常的是,我不期待我通常把它放在演員主管的東西:

override val supervisorStrategy = 
    OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { 
    case _: ArithmeticException  => { 
     log.error("\n# ArithmeticException -> Resume\n") 
     Resume 
    } 
    // other exceptions 
    } 
} 

對於其他類型的錯誤,我傾向於響應錯誤和後處理它:

case class IError(code:Int, msg:Option[String] = None) 

sender ! IError(401, msg= Some("Unauthorized"))