2013-10-15 22 views
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,异常不是由实现了抛出,但我们忘了拿干净的界面,所以不知道该抓不适用了:

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或源代码分析工具中检测那些声明但从不抛出的异常,以便能够进行一些清理?

+0

当您执行外部客户端将使用的API时,最好将所有Exceptions声明为RuntimeException。 – RamonBoza

+0

您是否应该实现一个接口,而不是更新接口作为实现更改的结果? –

+0

这并不意味着被外部客户使用。这只是我的项目的内部。我声明了一个接口,以便在不同时测试实现代码的情况下更容易地测试接口的客户端(这是同一产品中的其他类)。 – Xavier

回答

-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); 
     }}); 

???

+0

不是。我正在讨论在接口中声明的异常,但不会被任何实现抛出。这是一个代码清理问题,不是在运行时处理的东西 – Xavier

+0

写入示例。我不明白 – barwnikk