2011-05-03 93 views
2

因爲我確定你都知道Java爲錯誤處理強制執行一個非常嚴格的模式,因此任何異常都必須通過try catch塊或通過使用throws關鍵字聲明方法來處理。 (我可能會添加我真的很喜歡它的做法)Java錯誤處理

說了這麼多,我正在努力的是決定用各種方法處理錯誤的正確方法是什麼。來自C#/ VB.NET背景我以前一直嚴格遵守處理堆棧底部的錯誤(除了最具體的情況外),但是我不相信這是Java中最好的方法。

任何人都可以提供任何關於此?什麼被認爲是最佳實踐?如何決定是否應該在方法外拋出一個異常或者在內部處理異常(顯然有些情況是顯而易見的,但是分配不是)?

回答

10

在每個方法的基礎上,我問自己:

  1. 請問這種方法有足夠的信息來正確處理這個異常?如果是,處理它。否則...
  2. 調用者是否有足夠的信息來正確處理此異常?如果是的話,重新拋出。否則...
  3. 調用者是否需要專門處理來自此組件的操作失敗?如果是,則重新嵌套在組件異常子類中。否則...
  4. 重新啓動。
+0

這似乎是一個很好的通用的錯誤處理方法。謝謝! – 2011-05-03 13:47:27

+0

@bkail你能解釋'rethrow'(2)多一點在你的答案? – JJD 2012-08-12 21:40:02

+0

@JJD例如,SAXParser.parse方法可能會捕獲IOException(例如,日誌記錄,清理等),但它們會重新拋出異常,因爲調用者有上下文來處理它(例如,FileNotFoundException或其他一些I/O問題最終用戶可能知道如何解決)。 – 2012-08-13 05:53:54

1

這是一個陳腐的答案,但趕上例外,你實際上可以做些什麼來恢復。不同的例外情況意味着您可以在體系結構的不同級別處理異常。

1

如果且僅當您確實可以做某些事情來解決該問題,您希望處理髮生的異常。

這裏有一個常見的例子:

int foo(String userInput) { 
    int i = Integer.parseInt(userInput); 
    return i * 4; 
} 

這將引發除了非數字的字符串輸入。但你無法做任何事情,所以你讓它傳播。

再舉一例

class Communicator { 

    private InputStream in; 
    private OutputStream out; 

    public Communicator(Socket socket) throws IOException { 
     in = new ObjectInputStream(socket.getInputStream()); 
     out = new ObjectOutputStream(socket.getOutputStream()); 
    } 

} 

如果套接字拋出IOException,你能指望有可能復甦,使該通訊仍然工作?我想不是。放手吧,讓它傳播,讓它找到能夠應付它的人。

另外,您應該知道您不必catch或申報throws所有例外。如果它是RuntimeException,則不需要。 (NumberFormatException異常)對於一部分,這些異常通常意味着錯誤(?NullPointerException異常,任何人)或惡意的用戶輸入