我喜欢在使用它们之前检查方法的所有参数是否都有正确的信息。像这样:
public method(MyType param1)
{
try
{
if(param1 == null)
{
throw new ArgumentNullException("Error1");
}
if(param1.Property1 == null)
{
throw new ArgumentNullException("Error2");
}
if(param1.Property1.Amount <= 0)
{
throw new ArgumentException("Error3");
}
...
//Do what I need with the parameter
}
catch { throw; }
}
然而,in this post有人评论说将异常作为正常流程抛出并不是一个好主意,但我不确定是否是这种情况,因为如果我必须检查参数而且有ArgumentNullException
和ArgumentException
之类的例外,当参数有问题时它似乎可以被抛出,它让我想知道它是否真的是一个糟糕的方法,我的例子评价。
另一个用户提供它的另一个原因是异常消耗4000-8000个CPU周期。好吧,在我的情况下,目标是知道参数是否有一些错误,并且如果应用程序按预期工作,则永远不会抛出异常,因此在实践中,如果应用程序没有错误,那么性能不会&# 39;减少。
总而言之,我想知道在继续这个过程之前如何处理参数检查的最佳方法。
感谢。
答案 0 :(得分:2)
当必需值为null或缺失时,您肯定应该抛出异常。我想要清理这种情况的一件事是使用一种方法来检查Type是否有效,并在我的代码可能抛出异常时使用Exception注释。
缺点是,如果使用正确,Validate(...)方法将被调用两次。我喜欢Validate(...)方法,因为它允许更改在抛出异常之前找到错误,因为任何类都可以调用Validate(...)
class MyClass
{
/// <summary>
/// DoSomething
/// </summary>
/// <exception cref="InvalidOperationException">InvalidOperationException</exception>
public void DoSomething(MyType myType)
{
string errorMessage;
if (!Validate(myType, out errorMessage))
throw new InvalidOperationException(string.Format("Argument myType is not valid: {0}", errorMessage));
// Finish
}
/// <summary>
/// IsValid
/// </summary>
/// <exception cref="ArgumentNullException">ArgumentNullException</exception>
public static bool Validate(MyType myType, out string errorMessage)
{
errorMessage = null;
if (myType == null)
throw new ArgumentNullException("myType");
if (string.IsNullOrEmpty(myType.Property1))
errorMessage = "Property1 is required";
if (string.IsNullOrEmpty(myType.Property2))
errorMessage = "Property2 is required";
return errorMessage == null;
}
}
class MyType
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
答案 1 :(得分:1)
在参数验证后抛出异常是一种很好的方法。通过这种方式,您明确地让开发人员使用您的方法知道他正在调用它,这使他能够轻松修复此错误。
但是,我肯定会摆脱try...catch
部分。它绝对是多余的,使得代码比它需要的更复杂(并且有点令人困惑)。