Java - 在try {} catch块中打包所有类方法

时间:2013-09-06 08:37:18

标签: java

有没有办法在try {} catch块中打包所有类方法而不在每个方法中编写它?

在示例中我有那个类:

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

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

我不想为每个方法编写try catch块。有没有办法将try..catch块提取到某些代码并在每个方法中“注入”它?

7 个答案:

答案 0 :(得分:3)

如果您没有使用任何AOP框架,则可以使用Java Dynamic Proxy来调用类方法。在代理类调用期间,您可以处理异常(开始/结束事务等)。大多数AOP框架都是这样工作的。

答案 1 :(得分:2)

您可以将代码传递给处理异常的方法:

public void runTest(Runnable code) {
    try {
        code.run();
    } catch(Exception e) {
        //doing rollback
    }
}  

然后在每个test()方法中调用它:

public void test1() {
    runTest(new Runnable {
        //your code here
    });
}

答案 2 :(得分:1)

我担心,无法在源级别这样做。但AOP要拯救 - 例如,看一下aspectj或任何其他AOP框架。

答案 3 :(得分:0)

取决于你在回滚内需要做什么,你可以使用try with resources添加到Java 7来编写你的代码。

但不确定这是否是您的用例。

基本上,如果我想要一个文件,请在异常的情况下关闭我的代码:

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

原始代码:

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

使用此方法,您只需要try块。

一个很好的参考是this

答案 4 :(得分:0)

从您的评论中,您可以将您的应用程序与Spring集成。

然后,您可以使用spring transaction handling来处理数据库事务。

见这里: http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html

但它主要涉及在配置中定义数据源和事务管理器,然后使用@Transactional

注释每个方法

答案 5 :(得分:0)

你可以这样做:

public static void main(String[] args){
    Sample s= new Sample();
    try{
        s.test();
        s.test2();
    }
    catch(Exception e){
    }
}
class Sample{
  public void test() throws Exception{
  }
  public void test2() throws Exception{
  }
}

这是一个很好的做法,可以在main之前捕获所有异常,除非您在特定methods

中需要它

答案 6 :(得分: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中写,希望没有错字,只是表明了这个想法。