J'ai un itérateur (en fait un Source.getLines
) qui lit un flux infini de données d'une URL. Parfois, l'itérateur lance un java.io.IOException
en cas de problème de connexion. Dans de telles situations, je dois me reconnecter et redémarrer l'itérateur. Je veux que ce soit transparent afin que l'itérateur ressemble à un itérateur normal au consommateur, mais en dessous se redémarre lui-même si nécessaire.redémarre l'itérateur sur les exceptions dans Scala
Par exemple, je voudrais voir le comportement suivant:
scala> val iter = restartingIterator(() => new Iterator[Int]{
var i = -1
def hasNext = {
if (this.i < 3) {
true
} else {
throw new IOException
}
}
def next = {
this.i += 1
i
}
})
res0: ...
scala> iter.take(6).toList
res1: List[Int] = List(0, 1, 2, 3, 0, 1)
J'ai une solution partielle à ce problème, mais il échouera sur certains cas d'angle (par exemple un IOException sur le premier élément après un redémarrage) et il est assez laid:
def restartingIterator[T](getIter:() => Iterator[T]) = new Iterator[T] {
var iter = getIter()
def hasNext = {
try {
iter.hasNext
} catch {
case e: IOException => {
this.iter = getIter()
iter.hasNext
}
}
}
def next = {
try {
iter.next
} catch {
case e: IOException => {
this.iter = getIter()
iter.next
}
}
}
}
je continue sentir comme il y a une meilleure solution à cela, peut-être une combinaison de Iterator.continually
et util.control.Exception
ou quelque chose comme ça, mais je ne pouvais pas comprendre un. Des idées?
J'ai ajouté une solution avec 'continually' et' util.control.Exception' à ma réponse originale. – huynhjl