0

我有很多只有一个主要实现的 Java 接口(不包括模拟和存根)。

随着时间的推移,接口及其实现会不断发展,包括某些方法引发的异常。

问题是当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是当实现不再抛出异常时,会有警告提醒我们删除实现上的异常声明,但我们经常忘记将其从接口中删除。

因此,我们最终在接口的客户端代码中处理实际上从未抛出的异常。

第 1 步,我们在实现中有一个异常,它向上传播:

interface Service {
    void doSomething() throws MyException;
}
class ServiceImpl implements Service {
    void doSomething() throws MyException {
        if (dummyCondition) {
            throw new MyException("oops");
        }
        System.out.println("hello world");
    }
}
class Client {
    @Inject Service service;
    void clientCode() {
        try {
            service.doSomething();
        } catch(MyException e) {
            logger.error("oops", e);
        }
    }
}

第2步,实现不再抛出异常,但是我们忘记清理接口,所以没有意识到catch不再有用了:

interface Service {
    void doSomething() throws MyException;
}
class ServiceImpl implements Service {
    void doSomething() {
        if (dummyCondition) {
            logger.warning("actually, don't throw, just log 'oops'");
        }
        System.out.println("hello world");
    }
}
class Client {
    @Inject Service service;
    void clientCode() {
        try {
            service.doSomething();
        } catch(MyException e) {
            logger.error("oops", e); // we'll never get there.
        }
    }
}

理想情况下,我希望在界面上显示类似“异常声明但未由任何已知实现抛出”的警告。

有没有办法在 Eclipse 中或使用源代码分析工具来检测那些声明但从未抛出的异常,以便能够进行一些清理?

4

1 回答 1

-1

你的意思:

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread arg0, Throwable arg1) {
            System.out.println("Thread "+arg0+" throwed uncaught exception:");
            arg1.printStackTrace();


            cleanupcode(); //clean up code
            savefiles(); //method to save files used by your app
            //You can create here a dialog with crash:
            JOptionPane.showMessageDialog(null, "Thread "+arg0+" throwed uncaught exception: "+arg1);
            System.exit(0);
        }});

???

于 2013-10-15T14:51:52.687 回答