可关闭资源的选择性捕获
Selective catch for a closeable resource
这更多是语法/结构问题。
我正在使用 JDBC:Statement
和 ResultSet
,这意味着 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
。
使用嵌套的 try 结构,内部 try 仅包装 executeQuery
。将捕获处理程序添加到此内部尝试。让外部 try 没有 catch 处理程序,这样它将按原样传播所有其他 SQLException
s
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();
}
这更多是语法/结构问题。
我正在使用 JDBC:Statement
和 ResultSet
,这意味着 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
。
使用嵌套的 try 结构,内部 try 仅包装 executeQuery
。将捕获处理程序添加到此内部尝试。让外部 try 没有 catch 处理程序,这样它将按原样传播所有其他 SQLException
s
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();
}