我不完全把主題"proper exception handling"
寫進我的腦海。用try-catch捕捉異常
「只有在您可以採取一些措施修復 這種特殊情況時才能發現異常。
我不明白這一點。例如: 如果我不記得Convert.toInt()
引發的FormatException
,即使它只是向用戶顯示異常消息,我的程序也會崩潰。如果我發現了這個異常,並告訴用戶輸入的格式不正確,它就會存活下來。
那麼,我應該捕捉這種例外嗎?
我不完全把主題"proper exception handling"
寫進我的腦海。用try-catch捕捉異常
「只有在您可以採取一些措施修復 這種特殊情況時才能發現異常。
我不明白這一點。例如: 如果我不記得Convert.toInt()
引發的FormatException
,即使它只是向用戶顯示異常消息,我的程序也會崩潰。如果我發現了這個異常,並告訴用戶輸入的格式不正確,它就會存活下來。
那麼,我應該捕捉這種例外嗎?
例外只應只捉到,如果你能做些什麼來解決 因特殊情況
這裏固定也許不是最好的詞。如果你能處理它,你應該捕獲異常。處理可能是:
但你不應該捕捉異常,什麼也不做:
catch(FormatException ex)
{
}
這只是吞噬異常,你永遠不會知道是否發生了什麼壞事。
這並不意味着你讓異常處理不了。這意味着正確的應用程序流是不可能的,因此代碼應該返回並通知調用者(例外或消息)。而在你的情況下,由於輸入無效,所以你應該處理異常並讓調用者知道這裏有什麼問題。
如果我不捕獲Convert.toInt()引發的FormatException,即使它只是向用戶顯示異常消息,我的程序也會崩潰。
對,這是一個例外情況,可以正確處理。預期會發生來自用戶的錯誤輸入,您應該處理它。
雖然還有其他類的錯誤,但你可以做的事情很少。例如,一個OutOfMemoryException
。
「修復」這種情況並不一定要糾正它。當你發現一個錯誤並告知用戶這個錯誤時,這可能足以「修復」它。例如,你可以讓用戶改正輸入。
你的報價意味着你不應該做這樣的事情:
try
{
// do something which can throw
}
catch(Exception ex) // even this is bad practice as you should try to catch specific exceptions
{
// do nothing
}
這取決於什麼可用性可以提供給用戶,同時捕捉該特定例外。
假設您正在根據用戶輸入的參數進行一些計算,並且有一個字段是可選的。
現在,如果用戶爲該字段輸入一些字符串而不是數字字段,那麼如果沒有捕獲異常,程序將崩潰。
即使你發現了這個異常,你的計算也不會完成,因爲你將在拋出異常後跳過計算。
但是在這種情況下你可以做的是,檢查FormatException
是否被拋出用於該可選字段。如果是,則使用catch忽略該異常並將該值設置爲某個默認值,例如0,然後照常進行計算。
這是一個難以回答的問題,當然取決於您的設計,應用程序偏好。
當處理異常我儘量遵守以下規則:
當然,每個人在錯誤處理方面都有不同的意見,所以很難得到明確的答案。我的建議是建立你自己的規則(除非有人向你付錢,在這種情況下跟着他們!)。
崩潰,你可以通過你已經有答案的數目看 - 大量的的人對這個話題有強烈的感受! – Liath
換句話說,不要捕捉你不知道如何處理的異常。最終,任何異常都應該在某個時候處理(所以你的程序不會崩潰),但是你應該有一個合理的策略,以及如何做到這一點。
是的,我認爲你應該捕捉這個異常,因爲實際上你可以通過警告用戶輸入錯誤的格式來處理它。
還有其他解決方案可以避免出現格式異常,例如,如果您要求輸入一個整數,並且您的應用程序的WPF/Winform/Web應用程序可以使用NumericUpDown控件來確保用戶輸入一個整數。你也可以使用這種代碼,這樣你就不必管理例外:
if (int.TryParse(userEnteredValue, out resultInt))
{
}
程序將永遠爲'UnhandledExceptions' – Ravi