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

3

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

于 2013-09-06T08:49:38.977 回答
3

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

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

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

public void test1() {
    runTest(new Runnable {
        //your code here
    });
}
于 2013-09-06T08:50:14.230 回答
1

恐怕无法在源代码级别做到这一点。但是 AOP 来拯救 -例如,看看aspectj或任何其他 AOP 框架。

于 2013-09-06T08:43:22.927 回答
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

于 2013-09-06T08:46:43.623 回答
0

从您的评论中,您可能会受益于将您的应用程序与 Spring 集成。

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

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

但它本质上涉及在配置中定义您的数据源和事务管理器,然后使用注释每个方法@Transactional

于 2013-09-06T08:46:23.193 回答
0

根据您在回滚中需要做什么,您可以使用添加到 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 块。

是一个很好的参考。

于 2013-09-06T08:43:38.463 回答
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 回答