C#:处理返回值中的错误组合

时间:2012-04-25 17:55:28

标签: c# error-handling return-value

我觉得这可能是一个愚蠢的问题,但我不能找到我确定存在的简单解决方案。

我有一个C#类,可以根据其他文件验证配置文件。

可能有两种错误,它们在枚举中表示:

public enum ErrorType
{
    VersionsMismatch,
    UnsupportedCombination
}

有一个表示错误的结构:

 public struct ValiditionResult
    {
        public bool Valid { get; set; }
        public string ErrorMessage { get; set; }
        public ErrorType ErrorType { get; set; }
        public List<ConfProperties> InvalidProperties {get;set;}
    }

功能界面如下所示:

 public ValiditionResult Validate(string confFile, string progFile)

struct表示文件中所需的修复。

因此,如果有两种类型的修复,则应指定它。

指出所有错误的最佳方法是什么(将来可能会有两个以上)?

要返回ValidationResult结构的列表?对Enum进行一些异或?还有其他想法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用属性[Flags]

标记枚举

请参阅http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx了解详情。

答案 1 :(得分:0)

我认为这对于打包的异常是个不错的选择。您进行验​​证并创建抛出异常,然后抛出该聚合异常:

public IEnumerable<Exception> Validate(string configFile, string programFile)
{
    if(...)
      yield return new VersionsMismatchException(...);

    if(...)
      yield return new UnsupportedCombinationException(...);
}

然后你有一个方法可以获取所有异常,然后将它们打包为throw:

public void EnsureConfigurationIsValid(string configFile, string programFile)
{
    var exceptions = Validate(configFile, programFile).ToList();

    if(exceptions.Count > 0)
       throw new ValidationFailedException(exceptions); // creates an internal list
}

然后,您调用此validate方法的任何方法都只需要一个try/catch块来处理聚合异常并循环遍历聚合的每个异常并处理它们。

添加新规则然后只是使用新的yield语句成为validate方法中的另一个条件。

每个单独的异常都可以包含特定于该人的属性和数据,并且如果需要,它可以设置自己要显示的消息。

答案 2 :(得分:0)

如果ValidationResult捕获有关单个验证规则结果的信息,则返回List<ValidationResult>是有意义的。

然后,您可以使用results.Any(vr => !vr.Valid)等确定整体验证是否失败。

此外,代码中是否有一些事情可以解决验证失败?枚举是否会驱动代码打包和交付结果的方式/位置?我想知道枚举是什么实现的。