2013-04-19 2 views
6

미래의 배우가 예외를 throw하면 어떻게됩니까? http://doc.akka.io/docs/akka/snapshot/scala/futures.html에서 Akka 문서에 따르면Akka 선물 예외

: 예외가 잡힌 경우 행위자 또는 디스패처가 미래를 완료 한 경우

그것은 중요하지 않습니다, 미래 대신 유효한의 그것을 포함 결과. Future에 예외가 포함되어있는 경우 을 호출하면 Await.result가 다시 throw되어 다시 으로 처리 할 수 ​​있습니다.

나는이 코드의이 작품 실행할 때 내가보고있는 무슨이다 확실하지 않다 :

class Worker extends Actor { 
    def receive = { 
     case i: Int => throw new RuntimeException 
    }   
    } 

    implicit val system = ActorSystem("MySystem") 
    val worker = system.actorOf(Props(new Worker), name="worker") 
    implicit val timeout = Timeout(5 minutes) 
    val future = worker ? 0 
    val res = Await.result(future, 10 seconds) 

문서에 따라, Await.result 다시 예외를 발생하지만, 내가 무엇을 얻고 것은해야한다 TimeoutException! 누군가가 이것을 분명히 할 수 있습니까?

답변

14

액터의 경우 예외와 return it as a failure status을 알아야합니다. 당신은 시간 제한 예외가 있어요 그래서 지금 당신이 보낸 사람에게 아무것도 반환하지 않는 : 그들은 항상 결과를 전송하기 때문에 배우가되지 않지만

class Worker extends Actor { 
    def receive = { 
    case i: Int => { 
     try { 
     throw new RuntimeException 
     sender ! "Some good result" 
     } catch { 
     case e: Exception => 
      sender ! akka.actor.Status.Failure(e) // Alert the sender of the failure 
      throw e // Alert any supervisor actor of the failure 
     } 
    } 
    } 
} 

선물이 더 우아하게이 조금 처리 할 수 ​​있습니다 (이 줄 것이다 위에서와 같은 결과) :

val future = Future { 
    throw new RuntimeException 
    } 
+0

설명해 주셔서 감사합니다. 당신이 제공 한 링크는 배우와 미래 간의 상호 작용을 명확하게 해줍니다. 나는 당신의 이해에 기초하여,이 관계를 명확히하는 데 충분히 정확한 미래에 대한 나의 위의 참조를 발견합니까? – deepkimo

+0

아니요, 설명서가 더 좋았 으면합니다. 문제는 액터가 보낸 사람에게 아무 것도 반환하지 않는다는 것이므로 질문을 완료해야하는지 알 수 없습니다. 이것이 더 잘 문서화되었거나 질문이 막 제거되고 완전히 입력 된 수신 수신 액터 메 커니즘이 구현 된 경우 좋을 것입니다. 유형이 지정되지 않은 배우의 모호성은 형식이 지정되지 않고 완전히 알려지지 않은 응답 가능성의 모호함으로 인해 더욱 악화됩니다. – Noah

+0

이것이 필요합니까? 'throw e // 실패한 감독자를 알립니다 .' 오류가 로그인 액터의 "잘못된 비밀번호"로 인한 것이라고 가정합니다. 상사에게 도움이 될까요? – Jus12