我只是想了解一些有关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;
}
答案 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
}
您最好传递参数名称以实现哪个参数超出范围
在捕获。
我希望它有所帮助。