2016-08-19 2 views
0

try-catch-finally 상황에서 메서드 호출과 관련하여 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을 사용 중입니다.

+4

방법은 코드 중복을 줄이기위한 것입니다. 이 일을하는 좋은 예처럼 보입니다. –

+0

그런 식으로하는 데에는 단점이 있습니까? 마침내 메서드를 호출하면 해당 메서드가 제대로 실행되지 않을 수 있습니까? – wiredniko

+0

아니요, 여기에 솔루션에 대한 문제는 없습니다. –

답변

3

아니요, 새 방법 접근 방식에는 아무런 제한이없는 것 같습니다. 메소드는 코드 내에서 유연성을 제공하기 위해 생성 될 수 있습니다.

entityManagerProvider (다른 곳에서 전화하는 경우이 새 방법을 매개 변수로 전달할 수 있음) 만 있고 새로 만든 모든 개체 및 참조로 작업하고 있습니다. 그래서 새로운 메소드를 정의하고 마침내 {...}를 사용하는 곳 어디에서나 호출 할 수 있습니다.