2015-09-06 80 views
1

我只是想了解一些关于Exceptions如何工作的更多细节。从MSDN ArgumentOutOfRangeException Constructor (String)页我找到字条:“这构造函数初始化使用PARAMNAME参数的新实例的PARAMNAME财产PARAMNAME的内容应为人理解。”ArgumentOutOfRangeException构造函数(字符串)定义

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

如果是强制性的,如果方法输入参数更改了名称,字符串应该会自动更新,这样不便于维护。

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

回答

2

是什么究竟意味着什么?

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

如果是强制性的,如果方法定义改变了,那么对于维护目的而言,字符串应该会自动更新的方式不会更容易?

是的,它肯定会。这就是为什么C#6推出了nameof operator

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

这意味着它的意思。内容应该被读者理解,而不是机器。所以,你应该使它对问题具有描述性(可能是参数超出范围)。

这不是“强制性”为paramName匹配方法参数的实际名称,但它可能会帮助那些维护你的代码。

+0

因此,如果在某些时候方法的输入参数的名称发生更改,维护人员的最佳做法是更新Exception字符串呢?它不容易出错吗? – TasGeorg

+0

更新字符串是有道理的,是的,这可能容易出错。为了这个目的,C#6添加了'nameof'运算符。你可以在'nameof(amount)'中使用它。 –

0

为了简单明确地回答你的问题,不,不要紧,只要你通过这个论点。你只是通过在这里:

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

,并用它作为:

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

你最好通过参数名称来实现其参数超出范围 渔获。
我希望它有帮助。

相关问题