捕获 ResultSet.next() 的异常

Posted

技术标签:

【中文标题】捕获 ResultSet.next() 的异常【英文标题】:Catching ResultSet.next()'s exception 【发布时间】:2011-06-01 16:48:32 【问题描述】:

我有一个只向前的光标。由于某些问题,在某些行上获取特定列可能会引发异常(专有驱动程序,该异常实际上是由于编码引起的)。

那么如何在这段代码(Scala 代码)中捕获这样的异常:

while(rs.next)
    println(rs.getString("column"))

我试过while(true) 里面有一个try/catch 块,但显然在抛出异常之后,无论如何我都无法移动光标。调用.next()方法时抛出异常。

【问题讨论】:

如果 while(true) 选项不起作用,则必须修复驱动程序。即使您捕获了异常,驱动程序的 ResultSet 实现也会“损坏” 【参考方案1】:

我会使用scala.util.control.Exception。例如:

scala> import scala.util.control.Exception._
import scala.util.control.Exception._

scala> def div2(by: Int) = catching(classOf[ArithmeticException]) opt (2 / by)
div2: (by: Int)Option[Int]

scala> div2(2)
res23: Option[Int] = Some(1)

scala> div2(0)
res24: Option[Int] = None

【讨论】:

由于 Bozho 提到的这一点,知道这行不通,我试了一下,只是为了了解更多关于 control 包的信息。我做了while (true)catching(classOf[com.foo.BarException]) opt (rs.next) ,结果很有趣,它捕获了异常,并在抛出异常后准确地输出了 8 次相同的行。

以上是关于捕获 ResultSet.next() 的异常的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: 关闭的 Resultset: next

ResultSet 不为空,但 resultset.next() 返回 false

为啥最后一次“ResultSet.next()”迭代比之前的迭代花费更多的时间?

ResultSet next方法

ResultSet.next 始终为 false,表格已填充

在析构函数中捕获异常