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;
}
这到底是什么意思?
这意味着作为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
}
您最好传递参数名称,以了解哪个参数超出了范围在捕获。