Как поймать исключение в цикле / реакции актера? - PullRequest
3 голосов
/ 28 апреля 2011

Можно ли поймать исключение, возникшее в пределах 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"

1 Ответ

4 голосов
/ 29 апреля 2011

eActor имеет функцию-обработчик исключений, которую можно переопределить:

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
   org.scratch.act.ExceptionalActor@7f5663a2: caught java.lang.Exception: Impossible Exception
   :

И актерская смерть.

ref: Актеры в Scala

...