ArgumentException多个参数和嵌套参数的ParamName约定

时间:2015-02-05 02:54:40

标签: c# .net argumentexception

考虑我有一个课程如下:

class ProductPrice
{
   public string ProductName { get; set; }
   public decimal RegularPrice { get; set; }
   public decimal SalePrice { get; set; }
}

我有这样的功能:

public decimal CalculateDiscount(ProductPrice thePriceInfo)
{
   if (thePriceInfo.SalePrice > thePriceInfo.RegularPrice)
      throw new ArgumentException("Sale price cannot be greater than regular price.","?????");

   return (thePriceInfo.RegularPrice-thePriceInfo.SalePrice) / thePriceInfo.RegularPrice;
}

当我调用ArgumentException的构造函数时,我想知道我应该为ParamName参数(上面的?????)添加什么。

我想知道ParamName的标准约定是什么时候:

1)导致异常的参数嵌套在一个类中(即thePriceInfo.SalePrice)

2)异常是由于两个不同参数之间的相互作用(在这种情况下,SalePrice高于RegularPrice)。你用逗号或其他东西把它们分开吗?

此外,ParamName参数实际上是用于.NET本身的任何内容,还是流行的第三方工具,还是只是信息性的,可以被堆栈中的其他调用代码使用?

2 个答案:

答案 0 :(得分:4)

我不能代表可能使用该数据的第三方工具,但我认为没有任何约定。 MSDN表示它仅供参考:(对于最终用户,或者可能在上游的另一个程序集中捕获它的开发人员,因此他们可以相应地处理它)

  

paramName的内容旨在被人类理解。

因此,设置您认为传达正确信息的任何价值。 IMO,正常价格没有错,但售价是,所以要么是“SalePrice”,要么是“ProductPrice.SalePrice”。


如果我能做出观察......

这里没有任何无效或超出范围的参数 - 只是指定一个金额不能小于另一个金额的业务规则。这不是特例,也不需要例外。

我将你的逻辑拆分为两个......一个验证价格,一个计算折扣。

public bool IsDiscountValid(ProductPrice pp)
{
    return pp.SalePrice <= pp.RegularPrice;
}

public decimal CalculateDiscount(ProductPrice pp)
{
   return (pp.RegularPrice - pp.SalePrice) / pp.RegularPrice;
}

现在调用者可以以最适合您的程序的方式通知用户:

if (IsDiscountValid(thePriceInfo))
    return CalculateDiscount(thePriceInfo);

MessageBox.Show("Sale price cannot be greater than regular price.", "Invalid Price");

// or display text in a Label or whatever, depending on which platform you're using

答案 1 :(得分:2)

参数没有错,正是参数的状态是错误的。我建议扔NotSupportedException。来自MSDN

  

对于有时可能对象执行请求的操作的情况,对象状态确定是否可以执行操作