我正在开发一个C#.NET Framework 4.0库。
我有这段代码:
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 :(得分:8)
你几乎回答了自己的问题:
因为我正在寻找的值必须在数据库上。如果该值不在数据库上则是错误。
如果您的程序在没有该值的情况下不起作用,您应该抛出异常,否则您可以返回null并让库的用户决定下一步该做什么。
答案 1 :(得分:1)
我认为如果你想做一些事情,如果cmd.ExecuteScalar()返回null,那么你应该返回一个null。但正如你所说
我正在寻找的价值必须在数据库上。如果该值不在数据库上则是错误。
然后你应该抛出异常类型InvalidOperationException而不是ArgumentNullException。
答案 2 :(得分:0)
如果该值不在数据库上则是错误。
“我的关于系统状态的信念系统被违反”或“输入必须以某种方式无效”的错误?这听起来像是前者 - 所以我会抛出异常。听起来调用者在这种情况下不能合理地继续。如果可以的话,这是另一回事。
您可能希望使用InvalidOperationException
,或者可能创建自己的异常(例如InvalidDatabaseStateException
),因为它实际上并不是此对象的状态无效。
答案 3 :(得分:0)
根据此处http://msdn.microsoft.com/en-us/library/ms229009(v=vs.110).aspx和此处http://msdn.microsoft.com/en-us/library/ms229030(v=vs.110).aspx,例外情况非常昂贵,应谨慎使用。
我肯定会使用return Convert.ToByte(o)
并在调用函数上测试它。