2012-03-24 51 views
3

據我所知,如果你只聲明一個檢查的異常,它將通過你的所有方法傳播到主方法,並仍然中斷你的正常程序流程和你的程序仍然會停止工作。那麼,爲什麼不總是用try/catch來處理檢查的異常......這樣,你的程序不會因爲異常而停止?爲什麼要在方法的簽名中聲明異常?對不起,我的英文不好聲明一個異常而不是處理它的意義是什麼

+0

可能重複的[何時選擇檢查和未檢查的異常](http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions) – Bohemian 2012-03-24 15:04:55

+1

@dido:除了什麼Jon Skeet回答說(你可以真正處理的例外情況相對較少),你必須問自己這個問題:「程序員如何能夠用無數語言工作,甚至沒有檢查異常的概念? 「*。 Checked異常對於Java來說非常特殊,並且每天都有大量的程序員在使用,而這些語言沒有檢查異常的概念。您的客戶的問題域中存在檢查異常。 300 KLOC代碼庫,在這裏我們不會拋出一次檢查異常。 – TacticalCoder 2012-03-24 15:10:27

+0

可能重複[對檢查異常的情況](http://stackoverflow.com/questions/613954/the-case-against-checked-exceptions) – emory 2012-03-24 15:53:42

回答

10

據我瞭解,如果你只是聲明瞭一個檢查異常,將通過所有方法向下傳播的主要方法,仍然中斷正常的程序流程和程序仍然會停止工作。

絕對。這是一個事情如果發生了什麼事真的無法處理。

例如,假設您已經有一個程序正在用文件中的某些數據更新您的數據庫 - 但您無法加載該文件。

可能剛剛捕獲異常,忽略它,仍然在你的數據庫覆蓋數據......但將是一件好事。一旦你處於一種你沒有做好準備的情況,或者你基本上不能明智地繼續下去,那麼停止是做負責任的事情

當然,如果你能真正處理異常並繼續前進,這是偉大的 - 但我的經驗,也有相對幾個錯誤,其中是這樣的話。如果你正在編寫一個服務器端應用程序,你通常要中止請求(並給客戶端一個錯誤)。如果你正在編寫一個用戶界面,那麼你可能只想放棄當前的操作,通知用戶並讓他們繼續......這是一個稍微不同的情況。

但是無條件地捕捉所有異常並假裝它們沒有發生? <不寒而慄>

+0

fyi,我認爲他的意思是* unchecked *(它會傳播) 。你的答案雖然好:) – Bohemian 2012-03-24 15:06:50

+1

@Bohemian其實我認爲他真的意味着_checked_異常,因爲他在談論必須在方法簽名中聲明它們。 – Thomas 2012-03-24 15:09:30

1

例如,如果調用方法能夠更好地處理異常。

假設你有一些讀取文件的方法。如果文件不存在,該方法如何知道需要發生什麼?也許整個程序應該終止,也許我們應該彈出通知用戶,也許它應該記錄異常並繼續,也許它應該嘗試從備份恢復文件。只有調用方法知道,所以它應該實現異常處理。

0

它適用於更復雜的系統。誰在鏈上使用你的代碼可能想知道哪裏出了問題,所以你讓他們處理這個異常。它不一定完全一致(並且不可能真的,除非堆棧中的每一個方法拋出異常,這將打敗整個目的。)

2

例外的一點是,您可以選擇at其中級別可以捕獲它們;您不必立即執行此操作 - 有時候這是正確的做法,但是單個頂級catch子句可以通過記錄它們來處理所有其他異常,然後跳到下一個任務/請求(例如在一個servlet容器中)。

Java的檢查異常試圖通過強制您處理或聲明異常來使此機制更加明確。這可以防止您忘記即將處理的異常。然而,許多人認爲這是一個語言設計失敗的實驗(注意,沒有其他語言採用檢查異常),因爲它迫使你在所有級別上都有一些與異常相關的代碼 - 正是爲了避免異常而設計的。

相關問題