java 中的 try-catch-finally 块
try-catch-finally block in java
根据我的理解,我想遵循最佳实践在最后释放资源以防止任何连接泄漏。这是我在 HelperClass 中的代码。
public static DynamoDB getDynamoDBConnection()
{
try
{
dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
}
catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
dynamoDB.shutdown();
}
return dynamoDB;
}
我的疑问是,既然无论如何都会执行 finally 块,那么 dynamoDB return 的空连接是否会因为它将在 [=16] 中关闭=]finally块然后执行return语句? TIA.
您的理解是正确的。 dynamoBD.shutdown()
将始终在 return dynamoDB
.
之前执行
我不熟悉你正在使用的框架,但我可能会按如下方式组织代码:
public static DynamoDB getDynamoDBConnection()
throws ApplicationSpecificException {
try {
return new DynamoDB(new AmazonDynamoDBClient(
new ProfileCredentialsProvider()));
} catch(AmazonServiceException ase) {
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
throw new ApplicationSpecificException("some good message", ase);
}
}
并将其用作
DynamoDB con = null;
try {
con = getDynamoDBConnection();
// Do whatever you need to do with con
} catch (ApplicationSpecificException e) {
// deal with it gracefully
} finally {
if (con != null)
con.shutdown();
}
您还可以为您的 dynamoDB 连接创建一个 AutoCloseable
包装器(在 close
中调用 shutdown
)并执行
try (DynamoDB con = getDynamoDBConnection()) {
// Do whatever you need to do with con
} catch (ApplicationSpecificException e) {
// deal with it gracefully
}
是的,dynamoDB 将 return 一个空连接,因为 dynamoBD.shutdow()
将在 return 语句之前执行,始终。
我们 "imitate" 错误怎么样,看看会发生什么?这就是我的意思:
___Case 1___
try{
// dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
throw new AmazonServiceException("Whatever parameters required to instantiate this exception");
} catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
//dynamoDB.shutdown();
slf4jLogger.info("Database gracefully shutdowned");
}
___Case 2___
try{
// dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
throw new Exception("Whatever parameters required to instantiate this exception");
} catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
//dynamoDB.shutdown();
slf4jLogger.info("Database gracefully shutdowned");
}
这些练习可能是使用单元测试的完美场所,更具体地说 mock tests. I suggest you to take a close look at JMockit,这将帮助您更轻松地编写此类测试。
虽然我没有回答你关于 finally 块总是被执行的问题(这个问题已经有几个答案),但我想分享一些关于如何使用 DynamoDB 客户端的信息。
DynamoDB 客户端是一个线程安全对象,旨在在多个线程之间共享 - 您可以为您的应用程序创建一个全局对象,并在需要时重复使用该对象。通常,客户端创建由某种 IoC 容器(例如 Spring IoC 容器)管理,然后由容器通过依赖注入提供给任何需要它的代码。
在幕后,DynamoDB 客户端维护一个 HTTP 连接池,用于与 DynamoDB 端点通信,并使用来自该池的连接。池的各种参数可以通过在构造客户端时传递 ClientConfiguration 对象的实例来配置。例如,其中一个参数是允许打开的最大 HTTP 连接数。
根据以上理解,我会说,由于 DynamoDB 客户端管理 HTTP 连接的生命周期,资源泄漏不应该真正成为使用 DynamoDB 客户端的代码的关注点。
根据我的理解,我想遵循最佳实践在最后释放资源以防止任何连接泄漏。这是我在 HelperClass 中的代码。
public static DynamoDB getDynamoDBConnection()
{
try
{
dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
}
catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
dynamoDB.shutdown();
}
return dynamoDB;
}
我的疑问是,既然无论如何都会执行 finally 块,那么 dynamoDB return 的空连接是否会因为它将在 [=16] 中关闭=]finally块然后执行return语句? TIA.
您的理解是正确的。 dynamoBD.shutdown()
将始终在 return dynamoDB
.
我不熟悉你正在使用的框架,但我可能会按如下方式组织代码:
public static DynamoDB getDynamoDBConnection()
throws ApplicationSpecificException {
try {
return new DynamoDB(new AmazonDynamoDBClient(
new ProfileCredentialsProvider()));
} catch(AmazonServiceException ase) {
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
throw new ApplicationSpecificException("some good message", ase);
}
}
并将其用作
DynamoDB con = null;
try {
con = getDynamoDBConnection();
// Do whatever you need to do with con
} catch (ApplicationSpecificException e) {
// deal with it gracefully
} finally {
if (con != null)
con.shutdown();
}
您还可以为您的 dynamoDB 连接创建一个 AutoCloseable
包装器(在 close
中调用 shutdown
)并执行
try (DynamoDB con = getDynamoDBConnection()) {
// Do whatever you need to do with con
} catch (ApplicationSpecificException e) {
// deal with it gracefully
}
是的,dynamoDB 将 return 一个空连接,因为 dynamoBD.shutdow()
将在 return 语句之前执行,始终。
我们 "imitate" 错误怎么样,看看会发生什么?这就是我的意思:
___Case 1___
try{
// dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
throw new AmazonServiceException("Whatever parameters required to instantiate this exception");
} catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
//dynamoDB.shutdown();
slf4jLogger.info("Database gracefully shutdowned");
}
___Case 2___
try{
// dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
throw new Exception("Whatever parameters required to instantiate this exception");
} catch(AmazonServiceException ase)
{
//ase.printStackTrace();
slf4jLogger.error(ase.getMessage());
slf4jLogger.error(ase.getStackTrace());
slf4jLogger.error(ase);
}
catch (Exception e)
{
slf4jLogger.error(e);
slf4jLogger.error(e.getStackTrace());
slf4jLogger.error(e.getMessage());
}
finally
{
//dynamoDB.shutdown();
slf4jLogger.info("Database gracefully shutdowned");
}
这些练习可能是使用单元测试的完美场所,更具体地说 mock tests. I suggest you to take a close look at JMockit,这将帮助您更轻松地编写此类测试。
虽然我没有回答你关于 finally 块总是被执行的问题(这个问题已经有几个答案),但我想分享一些关于如何使用 DynamoDB 客户端的信息。
DynamoDB 客户端是一个线程安全对象,旨在在多个线程之间共享 - 您可以为您的应用程序创建一个全局对象,并在需要时重复使用该对象。通常,客户端创建由某种 IoC 容器(例如 Spring IoC 容器)管理,然后由容器通过依赖注入提供给任何需要它的代码。
在幕后,DynamoDB 客户端维护一个 HTTP 连接池,用于与 DynamoDB 端点通信,并使用来自该池的连接。池的各种参数可以通过在构造客户端时传递 ClientConfiguration 对象的实例来配置。例如,其中一个参数是允许打开的最大 HTTP 连接数。
根据以上理解,我会说,由于 DynamoDB 客户端管理 HTTP 连接的生命周期,资源泄漏不应该真正成为使用 DynamoDB 客户端的代码的关注点。