创建一个类的异常安全包装器

时间:2013-05-06 05:56:27

标签: java exception

我有一个遗留类C1,实现接口I,可能会抛出一些例外。

我想创建一个类C2,也实现接口I,它基于C1的实例,但是捕获所有异常并对它们做一些有用的事情。

目前我的实现如下:

class C2 implements I {
    C1 base;

    @Override void func1() {
      try {
         base.func1();
      } catch (Exception e) {
         doSomething(e);
      }
    }

    @Override void func2() {
      try {
         base.func2();
      } catch (Exception e) {
         doSomething(e);
      }
    }

    ...

}

(注意:我也可以使C2扩展C1。这对当前的问题无关紧要。)

接口包含许多功能,因此我必须一次又一次地编写相同的try ... catch块。

有没有办法减少代码重复量?

1 个答案:

答案 0 :(得分:1)

您可以制作代理,它实际上可以是通用的

interface I1 {
    void test();
}

class C1 implements I1 {
    public void test() {
        System.out.println("test");
        throw new RuntimeException();
    }
}

class ExceptionHandler implements InvocationHandler {
    Object obj;

    ExceptionHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            return method.invoke(obj, args);
        } catch (Exception e) {
            // need a workaround for primitive return types
            return null;
        }
    }

    static <T> T proxyFor(Object obj, Class<T> i) {
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { i },
                new ExceptionHandler(obj));
    }
}

public class Test2 {

    public static void main(String[] args) throws Exception {
        I1 i1 = ExceptionHandler.proxyFor(new C1(), I1.class);
        i1.test();
    }
}