我有一個迭代器(實際上是一個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