2011-05-31 17 views
1

我會試着問我的問題,以便它不會以簡單的議論式結束。例外:何時使用,計時,總體使用

我已經跳入最近在C#中編寫的應用程序,並且發現異常機制。而且我已經同他們進行了一些不好的經驗,如以下

// _sValue is a string 
try 
{ 
    return float.Parse(_sValue); 
} 
catch 
{ 
    return 0; 
} 

我把它改爲:

float l_fParsedValue = 0.0f; 
if (float.TryParse(_sValue, out l_fParsedValue)) 
{ 
    return l_fParsedValue; 
} 
else 
{ 
    return 0; 
} 

結果,我在Visual Studio中的輸出了,不再有消息充斥像

第一次有機會System.FormatException布拉布拉

字符串時像' - '到達片段。我認爲使用第二個片段更清晰。更進一步,我經常看到,例外情況經常被用於ilke:「如果出現任何問題,我會在這個try-catch中做任何事情,趕上。」

現在爲了不被誤解所困擾,我希望你們能夠幫助我明確地定義如何/何時使用這些例外以及何時堅持舊學校「如果......其他」。

在此先感謝您的幫助!

回答

4

在特殊情況下應該拋出異常。即當意外事件發生時。如果你期望一個函數經常拋出一個很可能是壞設計的異常。

在你的例子中,很明顯的是TryParse更好,因爲異常似乎經常發生。

但是,例如,當解析文件時,我期望它幾乎總是有效的。所以我通常使用Parse並捕獲異常並生成一個InvalidDataException,並將捕獲到的異常作爲內部異常。通常簡化解析代碼,即使它可能是不好的風格。

我建議埃裏克Lippers的博客文章:Vexing exceptions

2

Parse()/TryParse()情況下,最好不要等到例外,通過自己使用的TryParse和行爲上的不正確的輸入。

2

例外情況應該用於例外行爲,而不是用於流量控制。基本的指導方針是,如果正常的程序流程經常遇到異常情況,那麼你做錯了什麼。

但是,重要的是要注意,僅存在try { } catch { }本身不會對性能產生負面影響。只有當實際拋出異常並且需要計算堆棧跟蹤時,纔會看到(在某些情況下非常嚴重)性能下降。

+0

謝謝,我認爲在應用程序的某個時候,性能可能會因爲一堆事件而浪費! – 2011-05-31 08:21:02

0

啊,只要它那麼簡單!但是,唉 - 決定何時使用例外更多是主觀的。儘管如此,還是有可以使用的指導方針。例如,Microsoft has some

總而言之,拋出異常的經驗法則是 - 當函數不能完成它應該執行的操作時,您只會拋出異常。基本上每個功能都有一個合同 - 它有一個合法的輸入值範圍和一個合法的輸出值範圍。如果輸入值無效,或者無法提供預期的輸出值,則應該拋出異常。

請注意,這裏有一個難點 - 應該驗證(用戶輸入的)錯誤是否也會作爲異常拋出?有些學校的思想說不(包括微軟),有些人說是。你的來電。每種方法都有其優點和缺點,並且由您來決定如何構建代碼。

捕捉異常的經驗法則是 - 您應該只捕獲可處理的異常。現在,這也很滑。向用戶顯示錯誤信息還「處理」它?但如果是臭名昭着的StackOverflowExceptionOutOfMemoryException呢?你幾乎不能顯示任何東西。而這些可能並不是唯一可以讓整個系統處於不可用狀態的例外。再說一遍 - 你的電話。

1

迄今爲止還沒有深入研究的另一點是Exceptions有成本。它們顛覆了程序中正常的控制流程,並因此導致了一些資源的使用。

一個簡單的測試就是編寫一個程序,循環使用一些無效數據的原始float.Parse代碼,並比較運行TryParse版本需要多長時間 - 這會有一個小但明顯的差異。

有關異常決策時堅持在我的腦海一個片段是從this article

幾乎規則#1

在決定是否應拋出 例外,假裝扔 聲明使電腦嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶嗶!如果 你仍然想扔在那些 的情況下,去吧。使用異常作爲其正常處理的一部分

1

程序從 遭受所有的可讀性和經典 麪條代碼 可維護性問題。

- 安迪·亨特和戴夫·托馬斯

我認爲是關於如何/何時使用異常沒有簡單的正確答案。這取決於您正在使用的應用程序的體系結構和其他因素。

我建議你閱讀Code Complete書的章節8.3. Error-Handling Techniques8.4. Exceptions