【发布时间】:2011-11-17 23:51:11
【问题描述】:
每当我需要在 Java 中获取资源并保证资源被释放时,可能会引发异常,我使用以下模式:
try {
Resource resource = null;
try {
resource = new Resource();
// Use resource
} finally {
if (resource != null) {
// release resource
}
}
} catch (Exception ex) {
// handle exceptions thrown by the resource usage or closing
}
例如,如果我需要一个数据库连接,并且使用或关闭连接都会抛出异常,我编写如下代码:
try {
Connection connection = null;
try {
connection = ... // Get database connection
// Use connection -- may throw exceptions
} finally {
if (connection != null) {
connection.close(); // This can also throw an exception
}
}
} catch (SQLException ex) {
// handle exceptions thrown by the connection usage or closing
}
我不喜欢只做一个简单的 try-catch-finally,因为我有义务捕捉在数据库连接关闭时可能引发的(可能的)异常,而我从不知道如何处理那个异常。
有没有更好的模式来处理这种情况?
【问题讨论】:
-
为什么不在正常异常中添加finally子句。(本例中为SqlException..)
-
类似,但不完全是骗局:stackoverflow.com/questions/1335812/…
-
我不喜欢在关闭资源之前必须检查资源是否为空。我宁愿在 try 块之外创建资源并避免所有这些。关闭期间抛出的异常也非常无用,只需记录它们并继续。