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

本文关键字:框架 抛出异常 什么 空值 返回 你在这里 | 更新日期: 2023-09-27 18:04:48

我正在开发一个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)并在调用函数上进行测试。