使用'finally'按设计调用方法

时间:2016-08-19 14:52:21

标签: java try-catch-finally

try-catch-finally情况下,在调用方法时处理finally的正确方法是什么?

我要问的是一个服务实现类,它使得DB调用在每个方法中都有一个finally子句。

如果我要使用DRY方法,我不希望finally子句继续重复相同的代码。

例如

    try {
        // DB call  
    } catch (DAOException e) {
        // Error messages etc
    } finally {
        // entityMangerProvider is a field
        EntityManager entityManager = entityManagerProvider.get();
        EntityTransaction transaction = entityManager.getTransaction();
        if (entityManager.isOpen()) {
            if (transaction.isActive()) {
                transaction.rollback();
            }
            entityManager.close();
        }
    }

上面的finally重复出来。做这样的事情是否合适

private void closeEntityManager() {
    EntityManager entityManager = entityManagerProvider.get();
    EntityTransaction transaction = entityManager.getTransaction();
    if (entityManager.isOpen()) {
        if (transaction.isActive()) {
            transaction.rollback();
        }
        entityManager.close();
    }
}

然后执行此操作

    try {
        // DB call  
    } catch (DAOException e) {
        // Error messages etc
    } finally {
        closeEntityManager();
    }

这种方法有什么缺点吗?有没有更好的方法可以避免一遍又一遍地重复finally子句。

项目在Java 7上,如果重要的话。

1 个答案:

答案 0 :(得分:3)

不,您的新方法方法似乎没有任何限制。可以创建方法以在代码中提供灵活性。

你只有一个entityManagerProvider(如果从其他地方打电话,可以作为参数传递给这个新方法),然后让你继续使用所有新创建的对象和引用;所以最好定义新方法并在最后使用的地方调用它{...}。