2012-08-28 66 views
2

有一個很好的問題Catch block is not being evaluated when exceptions are thrown from finallys,它討論了在finally塊中引發異常的一些有時意想不到的結果。在finally塊中拋出一個異常是否是不錯的實踐?

我想不出有什麼好的理由說明你爲什麼要在finally塊中拋出一個異常。如果有以前的例外,它總是會丟失。我總是看到最終習慣於以永遠不會拋出異常的方式進行清理。

任何人都可以解釋什麼時候可以在finally塊中拋出異常嗎?

+0

最後拋出的異常將被來自相應的catch塊的來電者所捕獲。但正如祕魯所說,當爲了更安全和更清潔而爲之時,爲什麼還要考慮搞亂事情呢?最後是清理亂糟糟的事情,不要讓它更多。 – Zenwalker

+1

你提到的線程從一個觀點開始,即清理代碼拋出一個異常...不是通過'throw'的方式,而是違背開發人員的期望......所以有一個問題'*是否要從finally塊中拋出異常,並在*'根本?我想這不是... – horgh

+0

在那原來的帖子http://stackoverflow.com/questions/12150994/catch-block-is-not-being-evaluated-when-exceptions-are-thrown-from-finallys我給出了一個答案,說要將'finally'塊的內容封裝到try..catch中,以避免finally塊中可能出現的異常......我仍然認爲,應該這樣做,如果有任何警告finally塊可能會拋出一個異常 – horgh

回答

1

最後試一下是非常重要的構造。你可以確定,即使拋出一個異常,finally塊中的代碼也會被執行。處理外部資源釋放它們非常重要。垃圾收集不會爲你做到這一點。最後,你不應該有返回語句或拋出異常。這是可能的,但這是一個不好的做法,可能會導致不可預測的結果。

+1

是的,但這是關於拋出一個異常*從* a最後.. – 2012-08-28 05:04:49

1

當你最後拋出一個Exception時,它會傳播並最重要的停止在Exception被拋出的地方,所以最後的剩餘部分不會被執行。另外,如果在try塊中發生異常,它將消失,因爲當前塊將從finally塊中拋出。

我不能想出任何場景,因爲在最終拋棄Exception後,出於特定原因(可能有其他管理此類邏輯的方法)在調用者級別處理它,所以你可以在調用者級進程的基礎上進一步拋出Exception

我只能說所有會閱讀並嘗試遵循代碼的眼睛都會帶來健康的驚喜。

1

這很好,由.NET支持。問題是捕獲的例外,這是一個非常糟糕的做法。您將正確恢復程序狀態的機率非常低。

+0

你是說從最後拋出異常,但不趕上finally塊引發的異常罰款嗎?我不遵循推理。這不總是導致應用程序關閉? –

+0

當然。這是你想要的。如果無法將程序狀態恢復到代碼開始運行之前的狀態,則拋出異常,您無法處理異常。務必避免假定應始終捕獲異常。 –

相關問題