J'essaie d'utiliser Akka pour implémenter un serveur TCP pour un protocole d'application personnalisé. J'essaie de suivre l'exemple donné ici: http://doc.akka.io/docs/akka/2.0/scala/io.html pour faire des E/S non bloquantes dans une boucle de rendement pour ....Bizarre try/catch comportement avec Scala + Akka
Je trouve que lorsque je lance une exception depuis l'intérieur du bloc de rendement, je ne peux pas l'attraper de l'extérieur du bloc. Je pense que j'ai un malentendu fondamental sur la façon dont Akka ou Scala travaille ici et j'apprécierais tous les conseils.
J'ai résumaient le code à ceci:
import akka.actor._
import java.net.InetSocketAddress
class EchoServer(port: Int) extends Actor {
val state = IO.IterateeRef.Map.async[IO.Handle]()(context.dispatcher)
override def preStart {
IOManager(context.system) listen new InetSocketAddress(port)
}
def receive = {
case IO.NewClient(server) =>
val socket = server.accept()
state(socket) flatMap (_ => EchoServer.processRequest(socket))
case IO.Read(socket, bytes) =>
state(socket)(IO.Chunk(bytes))
case IO.Closed(socket, cause) =>
state(socket)(IO.EOF(None))
state -= socket
}
}
object EchoServer extends App
{
def processRequest(socket: IO.SocketHandle): IO.Iteratee[Unit] =
{
println("In process request")
try {
for {
bs <- IO take 1
} yield {
println("I'll get here")
throw new Exception("Hey-o!")
println("But not here ... as expected")
}
} catch {
case e: Exception => println("And not here ... wtf?"); IO.Done() // NEVER GETS HERE
}
}
ActorSystem().actorOf(Props(new EchoServer(8080)))
}
Peut-être plus pratique pour saisir l'essentiel ici: https://gist.github.com/2296554
Quelqu'un peut-il expliquer pourquoi le contrôle ne parvient pas à mon bloc catch dans cette situation?
je remarquai que si je tourne la consignation de débogage dans Akka, je vois ce message dans la sortie:
[DEBUG] [04/03/2012 22:42:25.106] [EchoServerActorSystem-akka.actor.default-dispatcher-1] [Future] Hey-o!
donc je suppose que l'exception est gérée par le se dispatcher Akka? Quelqu'un peut-il expliquer comment c'est possible?
Merci pour la réponse très utile, il efface vraiment les choses. –