繁体   English   中英

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

[英]Java - Pack all class methods in try{ }catch block

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

例如,我有那个课:

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

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

我不想为每种方法编写try catch块。 有什么方法可以将try..catch块提取到某些代码,然后在每种方法中“注入”它?

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

您可以将代码传递到处理异常的方法中,如下所示:

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

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

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

恐怕没有办法在源代码上做到这一点。 但是AOP可以帮助您-例如查看Aspectj或任何其他AOP框架。

根据回滚内需要执行的操作,可以使用带有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块。

一个很好的参考,

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

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

参见此处: http : //static.springsource.org/spring/docs/2.0.8/reference/transaction.html

但这实际上涉及到在配置中定义数据源和事务管理器,然后使用@Transactional注释每个方法。

您可以这样:

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{
  }
}

除非您在特定methods需要它,否则最好捕获所有main异常。

您的方法可能会引发不同的异常,并且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编写,希望没有错别字,只是展示这个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM