抓住并继续

时间:2011-08-18 20:45:04

标签: c#

我想要一个扩展方法或泛型方法,我希望代码执行能够继续,即使存在一些异常并继续在列表中记录异常。这是我试过的一个例子

    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中的错误数据),不应该创建这样的对象。这些只是关注的例子

3 个答案:

答案 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和异常抛出都很昂贵。