Iterator如何处理已检查的异常?

ama*_*ion 8 java iterator exception-handling recordset

我在java.util.Iterator中包装java.sql.RecordSet.我的问题是,如果任何记录集方法抛出SQLException,我该怎么办?

java.util.Iterator中的javadoc解释了在各种情况下抛出什么样的异常(即NoSuchElementException异常的情况下,调用next()超出了最后一个元素)

但是,它没有提到当存在由网络或磁盘IO问题引起的完全不相关的问题时该怎么做.

只是在next()和hasNext()中抛出SQLException是不可能的,因为它与Iterator接口不兼容.

这是我目前的代码(简化):

public class MyRecordIterator implements Iterator<Record>
{
    private final ResultSet rs;

    public MyRecordIterator() throws SQLException
    {
        rs = getConnection().createStatement().executeQuery(
                "SELECT * FROM table");         
    }

    @Override
    public boolean hasNext()
    {
        try
        {
            return !rs.isAfterLast();
        }
        catch (SQLException e)
        {
            // ignore, hasNext() can't throw SQLException
        }
    }

    @Override
    public Record next()
    {
        try
        {
            if (rs.isAfterLast()) throw new NoSuchElementException();
            rs.next();
            Record result = new Record (rs.getString("column 1"), rs.getString("column 2")));
            return result;
        }
        catch (SQLException e)
        {
            // ignore, next() can't throw SQLException
        }
    }

    @Override
    public void remove()
    {
        throw new UnsupportedOperationException("Iterator is read-only");
    }
}
Run Code Online (Sandbox Code Playgroud)

bra*_*ter 11

我会将检查的异常包装在未经检查的异常中,允许在不破坏Iterator的情况下抛出它.

我建议一个特定于应用程序的异常扩展RuntimeException,实现构造函数(String,Throwable),以便您可以保留对原因的访问.

例如.

    @Override
    public boolean hasNext() {
      try {
        return !rs.isAfterLast();
      } catch (SQLException e) {
        throw new MyApplicationException("There was an error", e);
      }
    }
Run Code Online (Sandbox Code Playgroud)

更新:要开始寻找更多信息,请尝试Googling'check unchecked java sqlexception'.在onjava.com上详细讨论了关于"异常处理的最佳实践"的已检查与未经检查的异常处理,并讨论了IBM Developerworks上的一些不同方法.