我有一个迭代器(实际上是一个Source.getLines
),它从URL中读取无限数据流。当有连接问题时,偶尔迭代器会抛出java.io.IOException
。在这种情况下,我需要重新连接并重新启动迭代器。我希望这是无缝的,以便迭代器看起来像一个正常的消费者迭代器,但在下面根据需要重新启动。重新启动迭代器在Scala中的异常
例如,我想看到以下行为:
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)
我有一个部分解决了这个问题,但它会在某个角落的情况下失败(例如IOException异常后的第一项重新启动),它是相当难看:
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
}
}
}
}
我一直感觉像有一个更好的解决了这个,也许一些Iterator.continually
和util.control.Exception
或类似的东西的组合,但我想不出一个出来。有任何想法吗?
我添加了一个解决方案'持续'和'util.control.Exception'到我原来的答案。 – huynhjl 2010-11-20 12:07:58