考虑我有一个课程如下:
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本身的任何内容,还是流行的第三方工具,还是只是信息性的,可以被堆栈中的其他调用代码使用?
答案 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
对于有时可能对象执行请求的操作的情况,对象状态确定是否可以执行操作