2011-04-28 2 views
3

Est-il possible d'intercepter une exception déclenchée au sein de behaviour? Où placer le try/catch? Je sais que react utilise des exceptions pour réutiliser le même fil pour différents acteurs et c'est pourquoi je ne sais pas où mettre le try/catch. Je veux attraper certaines exceptions par moi-même pour la journalisation.Comment attraper une exception dans la boucle/réaction d'un acteur?

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" 

Répondre

4

eLe Acteur a une fonction de gestionnaire d'exceptions qui peuvent être redéfinie:

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

Chaque fois qu'une exception est soulevée dans l'acteur qui entraînerait normalement de mettre fin - la exceptionHandler fonction partielle est appliquée à la exception.


Modifier

Avec filtre d'exception:

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" 
    } 

produit:

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

Et la mort acteur.

ref: Actors in Scala

+0

Cool! C'est exactement ce que je cherchais. Je suis impatient de voir le livre disponible sur Amazon. Je vous remercie! –

Questions connexes