2011-04-28 54 views
3

是否有可能在behaviour内发现异常?在哪里放置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

e下演员具有能够覆盖的异常处理功能:

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

很酷!这正是我所期待的。我期待在亚马逊上看到这本书。谢谢! – 2011-04-29 06:50:10