我想要一个扩展方法或泛型方法,我希望代码执行能够继续,即使存在一些异常并继续在列表中记录异常。这是我试过的一个例子
public void ValidateName()
{
if (_customer.Name.Length < 5)
throw new Exception("shortname");
}
public void ValidateAge()
{
if (_customer.Age < 5)
throw new Exception("short age");
}
internal void Validate()
{
this.CatchAndContinue(delegate()
{
this.ValidateName(); // throws exception and add to list
this.ValidateAge(); // but this should also execute
});
}
public void CatchAndContinue(Action action)
{
try
{
action();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
对于当前类,我可以将异常传递给ValidateName和ValidateAge方法,但我希望如果我们可以按照我想要的方式执行,而在validate()方法体中几乎没有变化。我在语义上知道这听起来很熟,但我需要很多地方才能做到这一点。或者如果有更好的东西可以实现它
修改
这个验证是一个简单的例子,不是在所有的场景中它都只是验证器。顺便说一下,在这种情况下,我想提供UI错误列表以及为什么抛出,因为当从DB构造模型时(由于DB中的错误数据),不应该创建这样的对象。这些只是关注的例子
答案 0 :(得分:3)
不要使用控制流的例外。
相反,您的validate方法应返回bool
,并让validate方法的客户端决定该怎么做。除此之外的一步是返回ValidationResult
,其ValidationStatus
属性指示成功或失败,以及Message
属性,用于记录验证失败的原因。
答案 1 :(得分:0)
收益/回报可能对您有用。
http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx
是否必须例外?
澄清:
internal IEnumerable<string> Validate()
{
if( _customer.Age > 5 ) { yield return "Too Old"; }
if( _customer.Name.Length < 3 ) { yield return "Not enough name characters"; }
}
// using it
IEnumerable<string> errors = myCustomer.Validate();
if( errors.Length > 0 ) {
// uh oh, print out the errors!
foreach( string error in errors ) {
MsgBox(error);
}
}
答案 2 :(得分:-1)
而不是throw
方法中的Validate
异常,我会添加到例外列表并返回一个bool
值,表示成功/失败(返回部分是可选的,只添加它如果你关心验证的状态)。
类似的东西:
public void ValidateName()
{
if (_customer.Name.Length < 5) {
LogValidationFailure("shortName"); // you can add more params if needed
return; // or return false if you need it
}
// do normal business here
}
这不仅更干净,而且性能更好,因为try / catch和异常抛出都很昂贵。