首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更好的方法来处理从某个DataSource抛出的异常?

有没有更好的方法来处理从某个DataSource抛出的异常?
EN

Stack Overflow用户
提问于 2012-07-12 23:55:53
回答 5查看 438关注 0票数 0

我目前正在做一个项目,它与数据库做了大量的工作。

下面是我在代码中多次重用的一个核心习惯用法。

我的问题是,有没有更好的方法来处理getTransformedResults方法每个步骤中的异常?这是处理SQLExceptions的适当方式,还是有更好、更简洁的方式呢?

感谢您的投入!

代码语言:javascript
复制
public ResultType handleResultSet(ResultSet rs);

public ResultType getTransformedResults(String query) throws SQLException {
  ResultType resultObj = new ResultType();

  Connection connection = null;
  try { 
    connection = dataSource.getConnection();
  } catch (SQLException sqle) {
    // cleanup 
    throw sqle;
  }

  Statement stmt = null;
  try { 
    stmt = connection.createStatement();
  } catch (SQLException sqle) {
    try { connection.close() } catch (SQLException dontCare) {}
    // cleanup
    throw sqle;
  }

  ResultSet rs = null;
  try { 
    ResultSet rs = stmtm.executeQuery(query);
    resultObj = handleResultSet(rs);
  } catch (SQLException sqle) {
    // cleanup
    throw sqle;
  } finally {
    if (rs != null) try { rs.close() } catch (SQLException dontCare) {}
    try { stmt.close() } catch (SQLException dontCare) {}
    try { connection.close() } catch (SQLException dontCare) {}
  }

  return resultObj;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-13 00:13:19

您可能会对使用Apache Commons DbUtils感兴趣,它就是针对这样的目的。

在尝试使用更复杂的JDBC时,它有一些缺点,但对于常规使用来说,它应该足够了。

除此之外,您的代码包含太多的try/catch块,可以简化为如下所示:

代码语言:javascript
复制
public interface ResultSetHandler<ResultType> {
     ResultType handleResultSet(ResultSet rs);
}

public <ResultType> ResultType getTransformedResults(String query, ResultSetHandler<ResultType> rsh) throws SQLException {      
  Connection connection = null;
  Statement stmt = null;

  try { 
    connection = dataSource.getConnection();
    stmt = connection.createStatement();
    ResultSet rs = stmtm.executeQuery(query);
    return rsh.handleResultSet(rs);
  } catch (SQLException sqle) {
    // cleanup 
    throw sqle;
  } finally {
    if(stmt != null) {
      statement.close(); // closes also resultSet
      connection.close();
    }
  }
}

尽管Apache Commons的DbUtils库在幕后做着同样的事情。

票数 0
EN

Stack Overflow用户

发布于 2012-07-13 00:01:26

Java 7有一些你可能会喜欢的结构,我认为你可以使用try/finally而不带catch (它模仿了你的catch和rethrow)。

此外,由于您已经捕获并处理了SQL异常,因此可能应该将其作为其他异常重新抛出--可能是作为运行时异常--这使得在主要入口点捕获所有运行时异常变得更容易,而不必在每次访问数据库时都处理异常。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 00:03:07

就我个人而言,我可能会通过传递接口实现而不是子类化来处理这一点。

最终,如果您只处理该方法中的异常,而不是污染主线代码,那么您还能做什么,这样做的意义是什么?你可以把每一步都做得更细粒度一点,这样就不会把所有的都放在一个方法里,但除此之外……

您可能会考虑特定于应用程序的异常,这可能会使测试和配置更清晰,但这取决于上下文。

界面理念的澄清

您可以使用一个接口来实现对结果集和查询字符串检索的处理,而不是子类化,因此有两个方法--一个用于查询,另一个用于结果。

您会将一个实现传递给一个实例,其中大部分是您现在拥有的,但是它接受接口而不是查询字符串。其余代码基本上是相同的,但它从接口impl获取查询字符串,并调用接口impl的结果处理方法,将结果保存到清除。

它本质上与您现在拥有的相同,但IMO更干净,因为任何类都可以实现接口,包括匿名类或域中的其他类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11455815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档