ArgumentOutOfRangeException构造函数(String)定义

本文关键字:定义 String 构造函数 ArgumentOutOfRangeException | 更新日期: 2023-09-27 18:11:35

我只是想获得有关异常如何工作的更多细节。从MSDN页面ArgumentOutOfRangeException构造函数(字符串)我发现注释:"这个构造函数使用ParamName参数初始化新实例的ParamName属性。 paramName的内容旨在被人类理解。"

这到底是什么意思?ArgumentException的字符串输入是否必须始终匹配方法定义输入名称?(即double amount -> "amount")

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

从MSDN单元测试教程,我们有以下代码:

       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;
    }

ArgumentOutOfRangeException构造函数(String)定义

这到底是什么意思?

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

如果它是强制性的,如果方法定义改变了,字符串应该以某种方式自动更新,这不是更容易维护吗?

是的,它肯定会。这正是c# 6引入nameof操作符的原因:

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

言之有理。内容应该由阅读它的人来理解,而不是机器。因此,您应该使它对问题具有描述性(可能参数超出范围)。

paramName与方法参数的实际名称匹配并不是"强制性的",但它可能会帮助维护您的代码。

为了简单明了地回答你的问题,No,不管你传递什么作为这个参数。你只需把它传递到这里:

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

,并将其用作:

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

您最好传递参数名称,以了解哪个参数超出了范围在捕获。