C# 方法中的参数检查

C# 方法中的参数检查,c#,exception-handling,C#,Exception Handling,我提出了一个关于公共方法的问题 结果对我来说似乎很清楚,但出于这个原因,我还有另一个关于这些参数检查的问题(我在发布我的最后一个问题时考虑了相同的问题,但公式是否笨拙且要求太多(一篇文章中不止一个问题),我希望这一次更好): 如果我有重复的参数,这些参数将被赋予我的一个类的公共方法,那么这些参数必须在每个公共方法中进行验证。如果我将检查委托给另一个(私有)方法,例如 void EnsureIndexIsValid(int index){ if(index <0 || index

我提出了一个关于公共方法的问题

结果对我来说似乎很清楚,但出于这个原因,我还有另一个关于这些参数检查的问题(我在发布我的最后一个问题时考虑了相同的问题,但公式是否笨拙且要求太多(一篇文章中不止一个问题),我希望这一次更好):


如果我有重复的参数,这些参数将被赋予我的一个类的公共方法,那么这些参数必须在每个公共方法中进行验证。如果我将检查委托给另一个(私有)方法,例如

void EnsureIndexIsValid(int index){
     if(index <0 || index > A_VALUE){
         throw new IndexOutOfRangeException(“..message..”);
     }
}
编辑: 下面的内容显然不是一个好主意

如果这是一种良好的做法,那么捕获更多此类检查的一般异常,然后重新抛出:

public void AMethod(int index,....){
  try{
      EnsureIndexIsValid(index);
      EnsuresValueIsInValidRange(anotherParamter);
  }catch(Exception e){
      throw e;
  }
  // ...
结论:

对于这条线索,这里有一个简短的答案:


参数检查的委托似乎是一种常见的模式,也是合理的。然而,重新抛出此类异常以隐藏验证方法并不明智。最好从验证方法返回一个布尔值,然后在检查失败时在公共方法中抛出异常。

您不应该捕获
异常
,只捕获您可以处理的异常,因此您不应该使用上一个示例。

您不应该捕获
异常
,只有那些你可以处理的,所以你不应该使用你的最后一个例子。

不,我不认为将验证委托给另一个方法是不好的做法,我不会为了给人留下这样的印象而重新抛出更高级别方法的异常。客户机并不真正关心异常从何而来,也不关心抛出异常的原因。

不,我认为将验证委托给另一个方法不是一个坏做法,我不会为了给人留下这样的印象而从更高级别的方法中重新抛出异常。客户机并不真正关心异常从何而来,只关心抛出异常的原因。

我认为在验证方法中抛出异常实际上是一种很好的做法,因为这是问题发生的位置(验证失败)。如果您需要知道谁调用了验证方法,异常将在其调用堆栈中提供该信息。因此,我将捕获并重新显示验证异常


HTH.

我想说,在验证方法中抛出异常实际上是一种良好的做法,因为这是问题发生的位置(验证失败)。如果您需要知道谁调用了验证方法,异常将在其调用堆栈中提供该信息。因此,我将捕获并重新显示验证异常


HTH.

我更希望私有方法是
bool IndexIsValid
,那么实际的
公共方法看起来像

if(!IndexIsValid(parameterToThisMethod))
{
    throw new ArgumentOutOfRangeException("parametersToThisMethod");
}
这样做的优点是将实际方法放在调用堆栈的顶部

此外,即使您以另一种方式(使用私有验证器方法抛出),此模式:

catch(IndexOutOfRangeException e)
{
    throw e;
}

对调用堆栈没有任何好处;要么简单地
抛出,或
抛出新的IndexOutOfRangeException(“参数”,e)

我更希望私有方法是
bool IndexIsValid
,那么实际的
公共方法看起来像

if(!IndexIsValid(parameterToThisMethod))
{
    throw new ArgumentOutOfRangeException("parametersToThisMethod");
}
这样做的优点是将实际方法放在调用堆栈的顶部

此外,即使您以另一种方式(使用私有验证器方法抛出),此模式:

catch(IndexOutOfRangeException e)
{
    throw e;
}

对调用堆栈没有任何好处;要么简单地
抛出,或
抛出新的IndexOutOfRangeException(“参数”,e)

我知道捕获异常不是很好(如果我问到良好的实践,我认为它会加倍糟糕),但我认为在只进行参数验证的情况下,它不会那么糟糕。如果发生stackoverflow异常,捕获将不会捕获,其他异常也不可能发生,但您是对的,这肯定不是很好。因此,扩展不是一个好主意。但是,关于重新抛出的主要问题是什么呢exception@happyclicker-编辑是个好主意。就我个人而言,我不太喜欢重复出现例外情况。您可以随时检查调用堆栈以查看哪个方法调用了您的验证代码。我知道捕获异常不是很好(如果我询问良好的实践,我认为它是两倍坏),但我认为在只进行参数验证的情况下,它不会那么坏。如果发生stackoverflow异常,捕获将不会捕获,其他异常也不可能发生,但您是对的,这肯定不是很好。因此,扩展不是一个好主意。但是,关于重新抛出的主要问题是什么呢exception@happyclicker-编辑是个好主意。就我个人而言,我不太喜欢重复出现例外情况。您可以随时检查调用堆栈,查看哪个方法调用了验证代码。