在多个方法中模板化大量完全相同的异常

时间:2014-01-22 13:46:36

标签: exception design-patterns aspectj aop

我有一些遗留代码看起来非常像这样:

public class RmiClient {

    public boolean method1() throws RmiException {
        try {
            IRmiServerMethods server = (IRmiServerMethods) Naming.lookup(serverName);
            return server.method1();
        }
        catch (NotBoundException e) {
            throw new RmiException("server not found");
        }
        catch (MalformedURLException | RemoteException e) {
            e.printStackTrace();
            throw new RmiException(e);
        }
    }

    public boolean method2(Parameter parameter) throws RmiException {
        try {
            IRmiServerMethods server = (IRmiServerMethods) Naming.lookup(serverName);
            return server.method2(parameter);
        }
        catch (NotBoundException e) {
            throw new RmiException("server not found");
        }
        catch (MalformedURLException | RemoteException e) {
            e.printStackTrace();
            throw new RmiException(e);
        }
    }
}

方法列表持续数千行。

有没有更好的方法来处理这些过度的异常处理?如何摆脱这个锅炉板?是否有一些良好的编程模式来处理这种情况? 方面的方式是什么?

虽然我确定之前可能已经问过这个问题,但我找不到它。

1 个答案:

答案 0 :(得分:2)

  

有没有更好的方法来处理这些过度的异常处理?

检查Naming.lookup()方法抛出的所有异常,因此您必须捕获它们或者让调用堆栈中的方法处理它们。没有解决方法。然而...

  

是否有一些好的编程模式来处理这种情况?

我认为问题在于您的代码与需要调用RMI服务的事实高度耦合。添加到客户端代码中的隐藏实现细节的抽象层可能是解决方案。

一个非常简单的选择是使用一个辅助类,它具有执行Naming.lookup()方法的责任,并处理抛出的异常。因此,每次客户端代码必须调用远程服务时,它都会与这个封装RMI调用问题的帮助程序类进行对话。

在不了解应用程序架构的情况下很难谈论模式,但总的来说,一种旨在解耦的模式将对您有所帮助。

  

如何摆脱这个锅炉板?

如果您有数千行代码遇到此问题,我看不到一种简单的方法来摆脱这段代码。可能最好的选择是设计解决方案并开始使用新代码并逐步重构现有解决方案。我不认为AOP可以帮助你。