2013-03-28 29 views
1

在下面的示例中,我從數據庫返回一個值,並將該值轉換爲double(如果由於爲空而導致翻轉),則將0設置爲默認值。使用Try Catch轉換值

using (SqlCommand cmd = new SqlCommand(sql.ToString(), conn)) 
{ 
    try 
    { 
     this.value = Convert.ToDouble(cmd.ExecuteScalar()); 
    } 
    catch (Exception) 
    { 
     this.value = 0; 
    } 
} 

通過在這種情況下使用Try Catch,這會被認爲是不好的做法?什麼是更好的方法來處理這種情況?

+0

您可以使用'double.TryParse'來代替。不一定*更好*練習,但比異常處理更快。 – Nolonar

+3

@Nolonar確實是更好的做法。 **不要使用**例外來控制流量。 – DHN

+0

@DHN採取的一點。謝謝你指出:) – Nolonar

回答

13

通過在這種情況下使用Try Catch,這會被認爲是不好的做法?

絕對。除此之外,如果任何東西失敗,則返回0,而不僅僅是返回值爲空。 (你真的想繼續,就好像一切都很好,如果事實證明,整個表被刪除了?)

如果要檢測一個空的返回值,你應該明確地這樣做:

object result = cmd.ExecuteScalar(); 
return result == null ? 0d : (double) result; 

這將仍然扔(並故意)如果有一個非空返回值不是 a double。你應該知道你的查詢應該返回什麼類型,如果發現你的類型錯誤,它就會失敗。

5

你想要Double.TryParse,這將返回一個布爾值,並且將一個未初始化的雙變量傳遞給它,並使用out參數賦值給它。

+1

我強烈反對,因爲我已經就Darren的回答發表了評論。當你有*字符串*進行轉換時,'TryParse'是合適的。 ExecuteScalar'不應該返回一個字符串,如果該值自然是一個'double',並且沒有理由引入字符串轉換。 –

+0

@JonSkeet對不起,我在你之前回答,但你當然是正確的,我已經學到了新的東西,謝謝! – JMK

0

這將被認爲是不好的做法。嘗試Catch並不意味着像這樣的程序流程。如果拋出了另一個異常,那麼您仍然可以捕獲它並將該值設置爲0.

特別檢查您的程序流程。顯式處理null更有效,並且更容易遵循。