2014-01-09 101 views
1

我不完全把主題"proper exception handling"寫進我的腦海。用try-catch捕捉異常

「只有在您可以採取一些措施修復 這種特殊情況時才能發現異常。

我不明白這一點。例如: 如果我不記得Convert.toInt()引發的FormatException,即使它只是向用戶顯示異常消息,我的程序也會崩潰。如果我發現了這個異常,並告訴用戶輸入的格式不正確,它就會存活下來。

那麼,我應該捕捉這種例外嗎?

+0

程序將永遠爲'UnhandledExceptions' – Ravi

回答

4

例外只應只捉到,如果你能做些什麼來解決 因特殊情況

這裏固定也許不是最好的詞。如果你能處理它,你應該捕獲異常。處理可能是:

  • 修復問題或返回一些默認值
  • 重試的東西
  • 記錄或通知用戶(我相信每一個例外,應該被記錄下來,即使你能解決這個問題)
  • 投入更多高層次的例外

但你不應該捕捉異常,什麼也不做:

catch(FormatException ex) 
{ 
} 

這只是吞噬異常,你永遠不會知道是否發生了什麼壞事。

1

這並不意味着你讓異常處理不了。這意味着正確的應用程序流是不可能的,因此代碼應該返回並通知調用者(例外或消息)。而在你的情況下,由於輸入無效,所以你應該處理異常並讓調用者知道這裏有什麼問題。

0

如果我不捕獲Convert.toInt()引發的FormatException,即使它只是向用戶顯示異常消息,我的程序也會崩潰。

對,這是一個例外情況,可以正確處理。預期會發生來自用戶的錯誤輸入,您應該處理它。

雖然還有其他類的錯誤,但你可以做的事情很少。例如,一個OutOfMemoryException

0

「修復」這種情況並不一定要糾正它。當你發現一個錯誤並告知用戶這個錯誤時,這可能足以「修復」它。例如,你可以讓用戶改正輸入。

你的報價意味着你不應該做這樣的事情:

try 
{ 
    // do something which can throw 
} 
catch(Exception ex) // even this is bad practice as you should try to catch specific exceptions 
{ 
    // do nothing 
} 
0

這取決於什麼可用性可以提供給用戶,同時捕捉該特定例外。

假設您正在根據用戶輸入的參數進行一些計算,並且有一個字段是可選的。

現在,如果用戶爲該字段輸入一些字符串而不是數字字段,那麼如果沒有捕獲異常,程序將崩潰。

即使你發現了這個異常,你的計算也不會完成,因爲你將在拋出異常後跳過計算。

但是在這種情況下你可以做的是,檢查FormatException是否被拋出用於該可選字段。如果是,則使用catch忽略該異常並將該值設置爲某個默認值,例如0,然後照常進行計算。

1

這是一個難以回答的問題,當然取決於您的設計,應用程序偏好。

當處理異常我儘量遵守以下規則:

  • 只有趕上例外,我可以處理和恢復(例如發送電子郵件通知)。應用程序可以繼續執行任務,並且不通知用戶 - 您不希望因爲您的電子郵件服務器關閉而導致其通知崩潰的進程。
  • 不要編程異常,優先使用int.TryParse()來檢查而不是依靠異常來指定程序流。
  • 務必在服務邊界到達之前捕捉異常。這可能是UI,WebService或某個接口。您不應該向用戶顯示異常,而應該記錄並向用戶返回用戶友好的消息(或錯誤代碼)。

當然,每個人在錯誤處理方面都有不同的意見,所以很難得到明確的答案。我的建議是建立你自己的規則(除非有人向你付錢,在這種情況下跟着他們!)。

+0

崩潰,你可以通過你已經有答案的數目看 - 大量的的人對這個話題有強烈的感受! – Liath

1

換句話說,不要捕捉你不知道如何處理的異常。最終,任何異常都應該在某個時候處理(所以你的程序不會崩潰),但是你應該有一個合理的策略,以及如何做到這一點。

1

是的,我認爲你應該捕捉這個異常,因爲實際上你可以通過警告用戶輸入錯誤的格式來處理它。

還有其他解決方案可以避免出現格式異常,例如,如果您要求輸入一個整數,並且您的應用程序的WPF/Winform/Web應用程序可以使用NumericUpDown控件來確保用戶輸入一個整數。你也可以使用這種代碼,這樣你就不必管理例外:

if (int.TryParse(userEnteredValue, out resultInt)) 
{ 

}