2013-10-15 62 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