代码之家  ›  专栏  ›  技术社区  ›  amarillion

迭代器实现应该如何处理选中的异常?

  •  8
  • amarillion  · 技术社区  · 15 年前

    我在java.util.iterator中包装一个java.sql.recordset。我的问题是,如果任何记录集方法抛出sqlexception,我该怎么办?

    这个 java.util.Iterator javadoc 解释在各种情况下要抛出哪些异常(即,如果在最后一个元素之后调用next(),则为NoSuchelementException)

    然而,它并没有提到当网络或磁盘IO问题导致完全不相关的问题时该怎么做。

    仅仅在next()和hasnext()中抛出sqlexception是不可能的,因为它与迭代器接口不兼容。

    这是我当前的代码(简体):

    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");
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  11
  •   brabster    15 年前

    我将把checked异常包装成unchecked异常,允许在不中断迭代器的情况下抛出它。

    我建议使用特定于应用程序的异常扩展runtimeexception,实现构造函数(string,throwable),这样您就可以保留对原因的访问。

    如。

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

    更新:开始寻找更多信息,尝试Google“检查未检查的Java SqExExcExchange”。关于检查异常处理和未检查异常处理的详细讨论 'Best Practises for Exception Handling' on onjava.com 并用不同的方法讨论 IBM Developerworks .