如何在自定义方法中处理错误的参数值

本文关键字:错误 参数 处理 自定义方法 | 更新日期: 2023-09-27 18:25:07

我有一个以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方法抛出一个异常

如何在自定义方法中处理错误的参数值

我会抛出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框架在验证参数时所遵循的模式。

另一种选择是让Update方法返回一个布尔值,指示操作是否成功。这对于允许API的用户在不抛出异常的情况下调用该方法非常有用(如TryParse方法),但是在这种情况下,没有必要,因为该方法的用户只需在调用该方法之前检查number参数的值,就可以轻松地避免抛出异常。

如上所述,您有很多选项,我建议您将返回值更改为bool并返回false以声明它没有更新,或者抛出ArgumentOutOfRangeException。

返回false的好处显然是不会引发异常,但是消费者必须确认更新已经发生,否则当访问该值并发现它没有更新时,他们会感到困惑。

如果使用异常方法,则可以向该方法添加xml注释,以声明如果数字为零或更低,则可以引发异常。这将显示在visualstudio的工具提示和对象浏览器中,以便消费者知道这可能发生。

/// <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)