Как я могу обработать неправильное значение аргумента в пользовательском методе? - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть класс с SortelList в качестве частного поля: каждый элемент этого списка имеет string в качестве ключа и пользовательские данные в качестве значения. Когда я вызываю метод Update моего класса, я указываю ключ и данные и:

  • если в списке нет указанного ключа, то в список добавляется новая запись;
  • в противном случае текущие данные обновляются указанными данными (поэтому исключение не выдается).

    public class Cache
    {
        private SortedList<string, Data> _list;
    
        // ... constructors and other methods
    
        public void Update(string key, Data value, int number)
        {
            Data data;
            if (this._list.TryGetValue(key, out data))
            {
                // update data using value and number
                //
                // ...
    
                _list[key] = data;   // overwrite the previous data with the updated data
            }
            else
            {
                _list.Add(key, value);
            }
        }
    }
    

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

  • Я мог игнорировать значения, меньшие или равные нулю: if (number <= 0) return;
  • Я мог бы заставить Update метод возвращать bool, поэтому: if (number <= 0) return false;
  • Я мог бы заставить метод Update вызвать исключение, если число не положительное.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Я бы выбросил ArgumentOutOfRangeException , например:

public void Update(string key, Data value, int number)
{
    if (number <= 0)
    {
        throw new ArgumentOutOfRangeException("number must be positive");
    }
    // Rest of the method
}

Это шаблон, за которым следует подавляющее большинство .Net Framework при проверке аргументов.

Альтернативой может быть метод Update, возвращающий логическое значение, указывающее, успешно ли выполнена операция.Это полезно для того, чтобы позволить пользователям вашего API вызывать метод без генерируемого исключения (как при использовании методов TryParse), однако в этом случае нет необходимости, поскольку пользователи метода уже могут тривиально избежать появления исключенийпросто проверяя значение аргумента number перед вызовом метода.

1 голос
/ 17 февраля 2012

Как уже говорилось, у вас есть несколько опций, я бы посоветовал вам либо изменить возвращаемое значение на bool и вернуть false, чтобы указать, что оно не обновлено, либо выдать ArgumentOutOfRangeException.

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

Если вы используете метод исключения, вы можете добавить xml-комментарий к методу, чтобы указать, что исключение может быть выдано, если число ноль или ниже. Это будет отображаться в всплывающей подсказке и в браузере объектов в Visual Studio, чтобы потребитель знал, что это может произойти.

/// <summary>
/// Updates the value in the cache for the supplied key.
/// </summary>
/// <param name="key">The key in the cache.</param>
/// <param name="number">The the number to store.</param>
/// <exception cref="ArgumentOutOfRangeException">Thrown if number is less than 1.</exception>
public void Update(string key, Data value, int number)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...