Что бы вы сделали здесь? Возврат нулевого значения или выдача исключения (руководства по разработке каркаса)

Я занимаюсь разработкой библиотеки 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(); может вернуть ноль, но Convert.ToByte(o); возвращает 0

Если cmd.ExecuteScalar(); возвращает null, это ошибка, потому что искомое значение должно быть в базе данных. Если это значение отсутствует в базе данных, это ошибка.

Что бы вы сделали здесь? Вернуть ноль или сгенерировать исключение?

4 ответа

Решение

Если это значение отсутствует в базе данных, это ошибка.

Ошибка в терминах "моя система убеждений о состоянии системы была нарушена" или "ввод должен быть как-то неверным"? Похоже, что это скорее первый - поэтому я бы бросил исключение. Похоже, что вызывающий абонент не может разумно продолжать в этом случае. Если они могут, это другое дело.

Вы можете использовать InvalidOperationException или, возможно, создайте свое собственное исключение (InvalidDatabaseStateException например) учитывая, что это не действительно состояние этого объекта, которое является недействительным.

Вы в значительной степени отвечаете на свой вопрос:

потому что значение, которое я ищу, должно быть в базе данных. Если это значение отсутствует в базе данных, это ошибка.

Если ваша программа не работает без этого значения, вы должны выбросить исключение, если нет, вы можете вернуть null и заставить пользователя библиотеки решить, что делать дальше.

Я думаю, что если вы хотите что-то сделать, если cmd.ExecuteScalar() возвращает ноль, то вы должны вернуть ноль. Но, как вы сказали,

значение, которое я ищу, должно быть в базе данных. Если это значение отсутствует в базе данных, это ошибка.

тогда вы должны генерировать исключение типа InvalidOperationException, а не ArgumentNullException.

Согласно здесь http://msdn.microsoft.com/en-us/library/ms229009%28v=vs.110%29.aspx и здесь http://msdn.microsoft.com/en-us/library/ms229030%28v=vs.110%29.aspx. Исключения .aspx очень дороги и должны использоваться с осторожностью.

Я бы наверняка использовал возврат Convert.ToByte(o) и проверить это на вызывающей функции.

Другие вопросы по тегам