这更多的是语法/结构问题。
我正在使用 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
,并让其他SQLException
抛出给方法调用者?我还想正确关闭 ResultSet
。
最佳答案
使用嵌套的 try 结构,内部 try 仅包装 executeQuery
。将 catch 处理程序添加到此内部尝试中。让外部 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();
}
关于java - 选择性捕获可关闭资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49885867/