2011-04-28 3 views
3

behaviour 내에 발생한 예외를 catch 할 수 있습니까? try/catch을 어디에 둘까요? 나는 react이 다른 액터에 대해 동일한 스레드를 재사용하기 위해 예외를 사용한다는 것을 알고 있습니다. 그 이유는 어디서 try/catch을 넣을 지 모릅니다. 나는 로깅을 위해 혼자서 어떤 예외를 잡기를 원한다.액터의 루프/반응 내에서 예외를 잡는 방법은 무엇입니까?

import scala.actors._ 
def behaviour: PartialFunction[Any,Unit] = { 
    case x => 
    println(x) 
    throw new IllegalStateException 
} 

val a = new Actor { 
    def act { 
    loop { 
     react { 
     behaviour 
     } 
    } 
    } 
} 
a.start 
a ! "Bam" 

답변

4

에테르 : 액터는 무시 될 수있는 예외 핸들러 기능을 갖는다 : 일반적으로는 종료하게 유용한 예외 액터에서 발생 될 때마다

override def exceptionHandler = { 
    case e: Exception => 
     println(e.getMessage()) 
} 

- exceptionHandler 일부 기능이 적용되고 예외. 예외 필터와


편집

:

class ExceptionalActor extends Actor{ 

    def act() { 
     loop { 
     react { 
      case "bad" => throw new NoSuchFieldException("Bad Message") 
      case "impossible" => throw new Exception("Impossible Exception") 
      case m => println("non-bad message " + m) 
     } 
     } 
    } 

    override def exceptionHandler = { 
     case e: NoSuchFieldException => println("handled " + e.getMessage()) 
    } 
    } 

    object Tester extends App { 
    val eActr = new ExceptionalActor 
    eActr start 

    eActr ! "any message1" 
    eActr ! "bad" 
    eActr ! "any message2" 
    eActr ! "impossible" 
    eActr ! "any message3" 
    } 

는 생산 :

non-bad message any message1 
    handled Bad Message 
    non-bad message any message2 
    [email protected]: caught java.lang.Exception: Impossible Exception 
    : 

그리고 배우의 죽음을.

ref : Actors in Scala

+0

쿨! 그게 정확히 내가 찾고 있던거야. 나는 아마존에서이 책을 볼 수 있기를 기대하고 있습니다. 고맙습니다! –

관련 문제