选择性捕获可关闭的资源

时间:2018-04-17 19:15:30

标签: java checked-exceptions autocloseable

这更多是语法/结构问题。 我正在使用JDBC:StatementResultSet,这意味着SQLExceptions在任何地方都被抛出。

我的代码如下所示:

private static final String MY_QUERY = "SELECT * FROM MY_TABLE";

public void lookAtMetadata() throws SQLException { 
  try (Statement myStatement = getStatement) 
  {
    try (ResultSet myResultSet = myStatement.executeQuery(MY_QUERY)) 
    {
      ResultSetMetadata metadata = myResultSet.getMetaData();
      // do other stuff with metadata
    }
  }
}

到目前为止一切顺利。 但是我希望在myStatement.executeQuery(MY_QUERY)失败时抛出一个特殊的异常,如下所示:

ResultSet myResultSet = null;
try 
{
  myResultSet = myStatement.executeQuery(MY_QUERY);
  // get metadata and do stuff 
} catch (SQLException e) 
{
  throw new MySpecialException(e);
} finally 
{
  if (myResultSet != null) myResultSet.close();
}

问题是,涉及ResultSetMetaData的其他操作也可能抛出SQLException,我不想用MySpecialException包裹它们。

有没有办法让我只能抓住来自查询执行的SQLException,并让其他SQLExceptions被抛给方法调用者?我还想妥善关闭ResultSet

1 个答案:

答案 0 :(得分:3)

使用嵌套的try结构,内部try只包装executeQuery。将catch处理程序添加到此内部try。保留外部try没有catch处理程序,以便它将按原样传播所有其他SQLException

ResultSet myResultSet = null;
try 
{
  try {
      myResultSet = myStatement.executeQuery(MY_QUERY);
  } catch (SQLException e) {
      throw new MySpecialException(e);
  }
  // get metadata and do stuff 
} finally 
{
  if (myResultSet != null) myResultSet.close();
}