ArgumentOutOfRangeException构造函数(String)定义

时间:2015-09-06 05:17:18

标签: c#

我只是想了解一些有关Exceptions如何工作的详细信息。从MSDN页面ArgumentOutOfRangeException Constructor (String)我找到了注释:“此构造函数使用paramName参数初始化新实例的ParamName属性。 paramName的内容旨在被人理解。”< / p>

这究竟意味着什么?是否必须始终匹配方法定义输入名称的ArgumentException的字符串输入? (即双倍金额 - >“金额”)

如果是强制性的,为了维护起来不容易,如果方法输入参数改变名称,字符串应该以某种方式自动更新?

从MSDN unitTesting教程我们有以下代码:

       public void Debit(double amount)
    {
        if (m_frozen)
        {
            throw new Exception("Account frozen");
        }

        if (amount > m_balance)
        {
            throw new ArgumentOutOfRangeException("amount");
          //throw new ArgumentOutOfRangeException("whatever");  <-- this is my comment
          //throw new ArgumentOutOfRangeException("what is the point?"); <-- this is my comment
        }

        if (amount < 0)
        {
            throw new ArgumentOutOfRangeException("amount");
        }

        m_balance -= amount;
    }

3 个答案:

答案 0 :(得分:2)

  

这究竟意味着什么?

这意味着作为paramName 传递的参数应该是导致异常的实际参数。为什么?因为如果抛出异常,这意味着你的程序遇到了错误行为,这将有助于知道哪个param超出了它的范围。

  

如果是强制性的,为了维护起来不容易,如果方法定义发生变化,字符串应该以某种方式自动更新?

是的,肯定会的。这正是C#6引入nameof operator

的原因
public void Foo(int amount)
{
     if (amount < balance)
         throw new ArgumentOutOfRangeException(nameof(amount));
}

答案 1 :(得分:2)

这正是它所说的。内容应该由阅读它的人理解,而不是机器。所以,你应该做一些描述问题的东西(可能参数 超出范围)。

它不是强制性的&#34;使blah.(*int)与方法参数的实际名称相匹配,但它可能会帮助那些维护代码的人。

答案 2 :(得分:0)

为了简单明确地回答你的问题,不管你是否认为这个问题并不重要。你只需将它传递到这里:

void SomeMethod(/*someParameters*/)
{
    ...
    throw new ArgumentOutOfRangeException("your desired name");
    ...
}

并将其用作:

try
{
    ...
    SomeMethod(...);
    ...
}
catch(ArgumentOutOfRangeException exception)
{
    use exception.ParamName
}

您最好传递参数名称以实现哪个参数超出范围 在捕获。
我希望它有所帮助。