2010-03-12 110 views
10

使用以下任何一種方法從對象中拉出一個double有什麼優點和缺點?不僅僅是個人喜好,問題我在尋找反饋,包括便於調試,性能,可維護性等TryCatch與TryParse的優缺點

public static double GetDouble(object input, double defaultVal) 
{ 
    try 
    { 
     return Convert.ToDouble(input); 
    } 
    catch 
    { 
     return defaultVal; 
    } 
} 

public static double GetDouble(object input, double defaultVal) 
{ 
    double returnVal; 
    if (double.TryParse(input.ToString(), out returnVal)) 
    { 
     return returnVal; 
    } 
else 
    { 
     return defaultVal; 
    } 
} 

回答

17
  • TryParse會比捕獲異常
  • TryParse表示發生預計更快 - 沒有例外這裏發生的一切,它只是你懷疑你的數據可能是無效的。
  • TryParse沒有使用異常處理正常的控制流

基本上,去TryParse :)

順便問一下,你的代碼可以改寫爲:

public static double GetDouble(object input, double defaultVal) 
{ 
    double parsed; 
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal; 
} 
+0

總經理喬恩, 什麼tryparse()的內部實現? 是這樣的: 嘗試 { Parse(); 返回true; (例外) { }返回false; } – Sunil

+2

TryParse轉換爲字符串(實際上是char *),試圖將該字符串解析爲數字(通過字符比較),然後執行各種其他檢查(範圍等)以確保Number是正確的類型。這裏沒有try catch塊:) –

4

的TryParse比聰明TryCatch性能更高效。

2

有Parse方法拋出壞的輸入異常是一個設計缺陷。當您從用戶獲取數據時,錯誤的輸入是預期的行爲。異常拋出很昂貴,它不是你想要在代碼中經常發生的事情。

謝天謝地,微軟意識到他們的錯誤並添加了TryParse方法。 TryParse的確如此,而不是會招致錯誤輸入的異常開銷,但缺點是它必須返回兩段數據,所以使用起來感覺有點尷尬。

現在,如果他們還沒有創建破碎的Parse實現首先,TryParse將被稱爲分析。

1

的TryParse更快,通常更好,但我會建議在框架中的TryCatch方法和後端的編程,因爲你可以提供更多的信息給客戶端有關該錯誤:

public double GetAge() 
{ 
    try 
    { 
     var input = _dataProvider.GetInput(); 
     return Convert.ToDouble(input); 
    } 
    catch(Exception ex) 
    { 
     throw new MyBackendException(ex); 
    } 
} 
+0

你仍然可以使用TryParse並在壞數據上引發你自己的異常。事實上,你應該這樣做,如果沒有其他的事情,爲了追蹤的目的。 –

+0

好的,但您只會收到一條關於「不良數據」的通用消息,並且您將丟失有關數據不好的信息。 InvalidCastException或FormatException或者InvalidCastException中的信息。在給定框架上編程我希望儘可能多地瞭解有關錯誤的信息。 無論如何,當壞的數據可能來自Web服務或存儲時,它不是「預期的行爲」,必須拋出IMO異常。 – onof