使用 'finally' 调用设计方法

Using 'finally' to call a method by Design

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

我问的原因是进行数据库调用的服务实现 class 可能在每个方法中都有一个 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,如果重要的话。

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

你只有一个 entityManagerProvider(如果从其他地方调用,你可以将它作为参数传递给这个新方法),其余的你正在处理所有新创建的对象和引用;所以定义新方法并在你使用 finally{...} 的任何地方调用它是完美的。