2

各メソッドに記述せずに、すべてのクラス メソッドを try{ }catch ブロックにパックする方法はありますか?

例では、そのクラスがあります:

class Sample{
  public void test(){
    try{
      ...
    }catch(){
      //doing rollback
    } 
  }

  public void test2(){
    try{
      ...
    }catch(){
      //doing rollback
    } 
  }
}

メソッドごとに try catch ブロックを記述したくありません。try..catch ブロックをいくつかのコードに抽出し、それを各メソッドに「注入」する方法はありますか?

4

7 に答える 7

1

ソースレベルでそれを行う方法はありません。しかし、救助へのAOP-たとえば、 aspectj、または他のAOPフレームワークを見てください。

于 2013-09-06T08:43:22.927 に答える
0

メソッドはさまざまな例外をスローする可能性があり、それrollbackも異なる可能性があります。したがって、それらを個別の方法で保持しても問題ありません

ただし、すべてのメソッドはvoidであり、それらのメソッドによってスローされる例外は同じであり、ロールバック関数も同じであると言う場合、この方法で実行できます。見栄えが良いかどうかはわかりません:

class Sample{
 public enum MethodFlag {Test1,Test2}

 public void doStuff(MethodFlag flag){
   try{
    if (flag==MethodFlag.Test1)
        test1();
    if(flag==MethodFlag.Test2)
        test2();
   }catch(FooException ex){
     rollback();
   }
 }

 private void test1(){...}
 private void test2(){...}
}


//calling it
Sample sample = new Sample();
sample.doStuff(Sample.MethodFlag.Test1);

IDE では書きませんでした。タイプミスがないことを願っています。アイデアを示しているだけです。

于 2013-09-06T08:53:29.433 に答える
0

ロールバック内で何をする必要があるかによって、Java 7 に追加されたリソース機能を使って try を使用してコードを書くことができます。

しかし、これがあなたのユースケースであるかどうかはわかりません。

基本的に、例外が発生した場合にファイルを閉じたい場合、コードは次のようになります。

try(InputStream in = new FileInputStream(fileName)) {
    //process data
    ...
}

元のコードの場合:

InputStream in = new FileInputStream(fileName);
try {
    //process data
    ...
} finally {
   try{
     in.close();
   }catch(Exception e){
   }
}

このアプローチを使用すると、try ブロックのみが必要になります。

良いリファレンスはこれです。

于 2013-09-06T08:43:38.463 に答える
0

あなたのコメントから、アプリケーションを Spring と統合することでメリットが得られる可能性があります。

その後、Spring トランザクション処理を使用してデータベース トランザクションを処理できます。

ここを参照してください: http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html

ただし、基本的には、構成でデータソースとトランザクションマネージャーを定義し、各メソッドに注釈を付ける必要があります@Transactional

于 2013-09-06T08:46:23.193 に答える