2014-05-22 36 views
0

我正在開發C#.NET Framework 4.0庫。你會在這裏做什麼?返回null或拋出異常(框架設計指南)

我有這樣的代碼:

public static byte GetBatchStatus(string connString) 
{ 
    if (string.IsNullOrEmpty(connString)) 
     throw new ArgumentNullException("connString"); 

    byte status; 

    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString)) 
    { 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand(); 

     cmd.CommandText = GetBatchStatusValueSQL; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 

     object o = cmd.ExecuteScalar(); 
     // Throws an ArgumentNullException if o is null. 
     if (o == null) 
      throw new ArgumentNullException("o"); 

     status = Convert.ToByte(o); 
    } 

    return status; 
} 

cmd.ExecuteScalar();可以返回null,但Convert.ToByte(o);返回0

如果cmd.ExecuteScalar();返回null它的一個錯誤,因爲我正在尋找的價值必須在數據庫。如果該值不在數據庫上,則爲錯誤。

你會在這裏做什麼?返回null或拋出異常?

+0

這個'哲學'問題更適合程序員,而不是在計算器中。 – kurast

+0

它應該拋出異常,因爲cmd.ExecuteScalar()返回null描述了一箇中斷(將記錄放入數據庫時​​未捕獲),並且應該在找到時提出。 –

+0

這與你的問題沒有關係,但是在連接字符串中傳遞了最佳設計?似乎應該是類的屬性(假設它是某種類型或存儲庫或DAL),或者是配置的一部分(應用程序)。config或web.config)。 –

回答

0

如果該值不在數據庫上是錯誤。

關於「我對系統狀態的信念系統已被違反」或「輸入必須無效」的錯誤?聽起來它更像前者 - 所以我會拋出異常。這聽起來像來電者在這種情況下不能合理地繼續。如果可以的話,那是另外一回事。

您可能需要使用InvalidOperationException,或者是因爲它不是真正的這個對象這是無效的狀態來創建自己的異常(InvalidDatabaseStateException爲例)。

+0

感謝您的回答。在這種情況下,調用者無法繼續。 – VansFannel

8

你幾乎回答自己的問題:

,因爲我在尋找值必須在數據庫。如果該值不在數據庫上,則爲錯誤。

如果你的程序沒有運行沒有這個值,你應該拋出一個異常,如果沒有,你可以返回null,並讓庫的用戶決定下一步該怎麼做。

1

我想如果你想要做一些事情,如果cmd.ExecuteScalar()返回null,那麼你應該返回一個null。但正如你所說

我正在尋找的值必須在數據庫上。如果該值不在數據庫上,則爲錯誤。

那麼你應該拋出異常類型InvalidOperationException而不是ArgumentNullException