java - 选择性捕获可关闭资源

标签 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,并让其他SQLException抛出给方法调用者?我还想正确关闭 ResultSet

最佳答案

使用嵌套的 try 结构,内部 try 仅包装 executeQuery。将 catch 处理程序添加到此内部尝试中。让外部 try 不带 catch 处理程序,以便它将按原样传播所有其他 SQLExceptions

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();
}

关于java - 选择性捕获可关闭资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49885867/

相关文章:

exception - 如何找到 "ignored"的异常?

java - Spring AOP避免检查异常声明

java - elm 的编译与 Java 的检查异常有何不同?

java - Android:检测协调器布局行为中的 snackbar 关闭或超时

java - 带有 boolean 值的 Switch 语句不起作用?

java - 在 try-with-resources block 中调用对象的方法

java - 为什么我们必须在 try-with-resource block 中声明和定义资源?

java - ResultSet 的 AutoCloseable Iterator 是否应该从终结器调用关闭?

java - 将 mac jdk 版本设置为 1.8

java - 不使用数组的斐波那契数列