你会在这做什么?返回null或抛出异常(框架设计指南)

时间:2014-05-22 12:44:56

标签: c# .net library-design

我正在开发一个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或抛出异常?

4 个答案:

答案 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)并在调用函数上测试它。