我正在开发一个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还是抛出异常?
你基本上是在回答你自己的问题:
因为我正在寻找的值必须在数据库上。如果该值不在数据库中,则出现错误。
如果你的程序没有这个值就不能工作,你应该抛出一个异常,如果不是,你可以返回null,让库的用户决定下一步怎么做。
我认为如果你想做一些如果cmd.ExecuteScalar()返回null那么你应该返回一个null。但正如你所说的
我正在寻找的值必须在数据库上。如果该值不在数据库中,则出现错误。
那么你应该抛出一个异常类型InvalidOperationException而不是ArgumentNullException
如果该值不在数据库中,则为错误。
在"我关于系统状态的信念系统被违反了"或"输入一定是无效的"方面的错误?听起来更像是前者——所以我会抛出一个异常。在这种情况下,听起来呼叫者不能合理地继续。如果他们能,那就是另一回事了。
您可能想使用InvalidOperationException
,或者可能创建您自己的异常(InvalidDatabaseStateException
为例),因为它不是真正的这个对象的状态是无效的。
根据这里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)
并在调用函数上进行测试。