2010-01-15 119 views
5

好吧,我犯了罪,我寫了太多這樣的代碼重構異常處理

try { 
    // my code 
} catch (Exception ex) { 
    // doesn't matter 
} 

現在,我要清理/重構這個。

我正在使用NB 6.7,並且代碼完成在第一次寫入時工作正常,添加了所有異常類型等。一旦我完成了上述代碼,請不要給予更多幫助。

你知道一種說NB的方法嗎再次檢查所有異常類型 ,並提出處理它們的建議 並再次執行代碼?

回答

1

當你問如何處理異常的建議...

有沒有普遍接受的方式來處理它們。否則,你打賭java語言會隱含這種行爲。

  • 異常不是一個低級約束,必須處理,直到編譯器足夠智能。
  • 例外是一種高級語言結構,用於表達語義「某種特殊情況發生,您不想與常規代碼混合使用您的處理方式;您更喜歡使用特定代碼進行處理」。

異常有兩種存在形式,由設計:

  • 檢查異常必須在每個可以把他們的方法進行明確。
  • 未檢查的異常(RuntimeException或Error的子類)通常是隱式的。

在代碼(方法或代碼塊)的每個級別,代碼必須選擇在發生任何異常(除未經檢查的異常,可以完全忽略該處理)的情況下應該做什麼。這是一個變化的責任的一種選擇,沒有決定適用於所有情況:

  • 過程:抓住它,並完全處理(調用代碼通常不知道發生了什麼事情)。目前的方法需要有責任。記錄開發者的堆棧跟蹤可能會很有用。
  • 步驟:趕上它,做一個與本地代碼相關的處理步驟,並重新拋出它(或重新拋出另一個異常與原始的原因)。
  • IGNORE:讓它承擔調用代碼的責任。

Java語言讓你有特定語法使得更容易處理的例外,如特定異常的捕獲,隨後更普遍的...


通常情況下,你在你的架構考慮異常,做出一些設計決定。一些例子(以獨特的方式混合):

  • 選擇有一層過程中低層拋出的所有異常(例如:交易服務)的日誌記錄developper,positionning一些全球信息爲用戶...
  • 讓一些異常繼續進行幾個方法調用,直到您到達代碼處理有意義的代碼爲止(例如,根據您的例外情況,您可以重試完整操作或通知用戶...)
3

問題是,你的抓包處理程序「處理」所有的異常,所以不需要Netbeans顯示任何更多的提示。

如果你的異常處理程序已經是空的,並且你打算重構它們,你可以暫時刪除它們。

提示:自動格式化您的代碼,搜索try並使用括號突出顯示來找到匹配的catch塊。然後刪除所有的處理代碼。

之後,Netbeans將再次提出各種操作來處理可能出現的異常。注意:Netbeans的默認處理(即只是日誌記錄)並不總是最好的選擇。

+0

請注意,這將不適用於任何'RuntimeException's。 – 2010-01-15 11:11:09

1

我只是提供了Eclipse的做法,並希望它有點similiar與NetBeans:

  1. 移除try/catch語句 - >日食將顯示編譯器錯誤
  2. 使用Eclipse的快速提示重構正確嘗試/捕捉(或拋出)語句

您可以保存現有的異常處理代碼,將其粘貼到重構後。

編輯

湯姆關於RuntimeException的一個很好的註釋。所以程序應該更好的是這樣的:

  1. 複製現有的catch子句,並粘貼到記事本/文本編輯器
  2. 移除try/catch語句 - >日食將顯示編譯器錯誤
  3. 使用Eclipse的快速尖重構正確的try/catch(或拋出)語句
  4. 粘貼存儲的catch子句在catch語句的順序結束

這將保留運行您的異常處理例外(和子類型!)。

所以從

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (Exception oops) { 
    // catch both IOException and NumberFormatException 
} 

你去

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (IOException oops) { 
    // catch IOException 
} catch (Exception oops) { 
    // catch NumberFormatException 
} 

(雖然你可以手動在這種情況下取​​代異常的NumberFormatException的,但它只是一個例子)

+1

請注意,這對於任何'RuntimeException'都不起作用。 – 2010-01-15 11:14:50

4

PMD識別所有這些地方你有空catch塊(PMD實際上做得更多)。它有NetBeans集成,所以試試看。

確定所有與空catch塊的地方之後,你就必須要考慮每一個本身:

  • 有時只是記錄消息
  • 有時附近的重組代碼。即如果您正在捕獲NullPointerException,請添加null檢查。
  • 有時您將不得不考慮重新拋出(並聲明checked)異常。