AutoCloseable 틱 방법 만 캐치에서 실행

ARKADIUSZ :


두에서 실행되는 두 가지 방법이에 내가 좋아하는 것 catchfinal블록. 내가 발견 한 AutoCloseable인터페이스를,하지만 난 유일한 예외의 경우 화재에 뭔가가 필요합니다.
처럼:

SomeService service = CreateService().andOpenTransaction()

try {
    service.doSomeMessyThingsInsideDB();
} catch (Exception e) {
    service.rollbackTransaction();
    throw e;
} finally {
    service.closeConnection();
}

그것은 간단하게 할 수있는 방법이 있습니까? 내가 말했듯이 나는 AutoCloseable 익숙하지만, 그것은 단지 finally 블록 날 수 있습니다. 나는 아직도 캐치 내에서 사용할 수 없습니다.

리노 :

그럼 당신은 몇 가지 자신 만의 인터페이스를 정의하고, 수 static주자 방법 :

public interface ErrorHandlingCloseable extends AutoCloseable {
     void run() throws Exception;
     void onError(Exception e);

     static void execute(ErrorHandlingClosable ehc) throws Exception {
         try(ErrorHandlingClosable temp = ehc) {
             ehc.run();
         } catch(Exception e) {
             ehc.onError(e);
             throw e;
         }
     }
}

어떤 그런 다음 다음과 같이 호출 할 수 있습니다 :

SomeService service = CreateService().andOpenTransaction();
ErrorHandlingCloseable.execute(new ErrorHandlingCloseable() {
    public void run() throws Exception { service.doSomeMessyThingsInsideDB(); }
    public void onError(Exception e) { service.rollbackTransaction(); }
    public void close() throws Exception { service.closeConnection(); }
});

그러나 당신은 여전히 ​​지저분한 것, 참조하십시오.

당신은이를 구현할 수 interface당신에 SomeService하지만 당신은 것을 제한하는 run()방법은 항상 호출합니다 doSomeMessyThingsInsideDB().


또 다른 방법은 여전히 유사한 Java8을 사용하고 기능 도우미를 작성하는 것입니다 interface:

public interface ThrowingRunnable {
   void run() throws Exception;
}

그리고 다음 static방법 곳 :

public static void execute(ThrowingRunnable action,
                           ThrowingRunnable onCatch,
                           ThrowingRunnable onFinally) throws Exception {
   try(AutoCloseable ao = onFinally) {
       action.run();
   } catch(Exception e) {
       onCatch.run();
       throw e;
   }
}

흥미로운 부분은 아마도 이것이다 : try(AutoCloseable ao = onFinally)"등록"당신의하는 onFinally경우 메소드가 호출 될 finally도달.

이것은 다음과 같이 호출 할 수 있습니다 :

execute(
    service::doSomeMessyThingsInsideDB, 
    service::rollbackTransaction, 
    service::closeConnection
);

추천

출처http://10.200.1.11:23101/article/api/json?id=478539&siteId=1