2013-07-14 104 views
9

在Eclipse中添加try/catch塊時,它給了我「使用try/multi-catch環繞」或「使用try/catch環繞」的選項。Try/Multi-Catch vs Single Catch

這是try /多陷阱:

try { 
     save.load(new FileInputStream(file.getAbsolutePath())); 
    } catch (FileNotFoundException | IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這是一個try/catch語句:

try { 
     save.load(new FileInputStream(file.getAbsolutePath())); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

什麼是使用一種或另一種的好處/影響?如果我是正確的,第一個例子會在引發異常的時候執行catch塊併產生SAME CATCH,而第二個例子會在啓用​​單獨的catch塊時拋出基於異常的catch。

還有什麼我應該知道的嗎?我以前從未使用過它們,也不知道它們是否值得使用。

+2

提高或降低可讀性! – Tdorno

+1

如果您在兩種情況下都做同樣的事情,請使用多重捕獲。如果不是,那麼不是。 –

+3

請注意'FileNotFoundException * *是一個'IOException'。 –

回答

6

tl; dr Mutlicatch單獨處理事情,多個catch塊更靈活,更好操作。這兩種技術可以結合使用。

如果你有一個try語句可以拋出許多不同的異常類型,你會想要多個catch塊。這是更多的代碼,但提供了更大的靈活性。

舉例來說,如果有插座的工作,一個SocketException,可以用什麼比重新連接和/或錯誤消息更抓(如作爲無意中電纜斷開簡單的東西可能會導致此)

如果空指針異常(雖然沒有被選中)被捕獲,但是你可能想寫一個日誌並在這裏緊急着陸,儘可能地清理你可以做的事情,並且可能會以代碼方式進行回溯。

此外,這可以進一步細分,其中不同類型的「常見」異常可能導致採取不同的操作(例如,連接丟失與名稱未解決,對第一個終端用戶有不同的影響連接嘗試)以及以不同方式處理的不同「重」異常。雖然你可以有一個(多個異常類型)catch塊,但它可能會單獨採取類似的操作處理所有異常(以與基於拔掉電纜的條件相同的方式向用戶呈現空指針異常)或需要if e instanceof FooException塊可降低可讀性。

您也可以將二者結合起來,multicatching所有的「共同」異常進入重試和好的消息,所有嚴重異常轉換成一個強制清除和關閉

你不想蹤跡的電纜絆倒,和你不想刷掉丟失的物體。

+0

如果有詳細解釋,請接受:)從您的回答中瞭解到很多! – Aaron

2

這是一個選擇的事情。您希望平衡可讀性,可移植性,可維護性以及不同的異常處理方式。

所以平衡使用...如果你所有的捕獲使用同一塊處理然後使用第一種形式,因爲這只是一個代碼塊,你不會一遍又一遍地重複自己。編譯器可以爲你優化一些東西。

另一方面,如果您以不同方式處理每個異常,請使用第二種形式。

這是有點廣泛的問題,答案取決於你的目標。

2

我相信,如果你的JDK就是Java JDK 7,而第二個片段將仍處於JDK 7和下方運行你的第一個代碼片段只適用。

如果您有一行代碼,可以拋出不同類型的異常,並要處理他們都以同樣的方式,將Multicatch適合你,因爲它可以節省幾行代碼。

但是,如果你有一個行代碼會拋出一些例外,你要單獨處理這些異常,單個抓異常會更適合你。

0

看,實際 try-catch結構的實用程序是,您可以將特定的錯誤處理函數應用於特定的異常。在你的情況下,除了要打印的堆棧軌跡之外,你不希望發生任何事情。例如,如果我希望窗口在拋出FileIOException時關閉,並且如果發生任何其他異常,我只需要顯示一條錯誤消息,那麼在第二次寫入時有多個try-catch塊會很有用代碼塊。在這種應用中,不過,你可能只是想有這樣一個問題:

try { 
    save.load(new FileInputStream(file.getAbsolutePath())); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

這將打印STRACK跟蹤所有異常。 :)

+0

堆棧跟蹤語句由Eclipse自動生成;他可能想要做的事情不是打印堆棧跟蹤。 – MathSquared

1

如果你想要做同樣的事情,所有異常,儘量的多漁獲物和的try-catch是一樣的,只不過前者是短。 所有程序員都懶惰。

當你想爲不同的異常做不同的事情:

​​

嘗試,多美中不足的是不是正確的選擇。


} catch(AException | BException e) { 
    System.err.println("A or B Exception occured"); 
} 

注意的e類型是的AExceptionBException最近的公用超類型。