如何处理类中每个方法的异常

时间:2016-11-21 01:58:25

标签: java design-patterns

我有一个类,我需要为每个方法添加try catch,但它看起来多余,所以我需要一个很好的方法来解决它,什么样的设计模式可以解决这个问题?

public class Test {
    public void a() {
        try {
            do something;
        } catch (Exception e) {
            logger.error("error happened");
        }
    }

    public void b() {
        try {
            do something;
        } catch (Exception e) {
            logger.error("error happened");
        }
    }
}

4 个答案:

答案 0 :(得分:1)

如果你做的事情与try catch有相同的值,那么你可以这样说吧

public class Test {
    public void a() {
        //do other stuffs that don't require try catch and different from b
        c(); //pass some values if you need too
    }

    public void b() {
        //do other stuffs that don't require try catch and different from a
        c(); //pass some values if you need too
    }

    public void c() { //catch values if you pass something from a and b
        try {
            do something;
        } catch (Exception e) {
            logger.error("error happened");
        }
    }//put return if you like.
}

但是如果你做了不同的事情并尝试捕获每种方法的价值,你真的必须这样做。

答案 1 :(得分:0)

为什么不尝试在方法之外捕获异常?

你只需要确保从这个方法中抛出什么异常

例如:

Test a = new Test();

try {
    a.a();
    a.b();
} catch (Exception e) {
    logger.error("error happened");
}

答案 2 :(得分:0)

您可以使用"执行"来执行此操作。成语,但它不会为你节省太多样板。以下内容不太合适 - 您需要定义TestLambda类。但有几点需要注意。

  1. executeAround将需要变体,具体取决于返回值等。
  2. 您的TestLambda定义需要抛出异常。 (标准的Java 8 lambdas没有。)
  3. 只是吞下例外是一种不好的做法。

  4. public static class Test {
        public void a() {
           executeAround( ()->{ do_something ; } );
        }
        public void b() {
           executeAround( ()->{ do_something_else; } );
        }
    
        private void executeAround( TestLambda fn ) {
           try {
              fn();
           } catch( Exception e) {
              logger.error("error happened");
           }
        } 
     }
    

答案 3 :(得分:0)

实用解决方案之一是使用spring ExceptionHandler

等框架

基本上,您在应用程序的较低层使用throws SomeException并捕获顶层的所有内容

控制器:

  @ExceptionHandler({SQLException.class,DataAccessException.class})
  public String databaseError() {
    return "databaseError";
  } 

以下图层:

public void doStufff throws SQLexception{
    // do stuff which may throw exception
}