Arkadiusz:
二つの異なる方法で実行されている必要があり、私は2つに希望catch
してfinal
ブロックを。私が発見した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
);