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

C#:处理返回值中的错误组合,c#,error-handling,return-value,C#,Error Handling,Return Value,我有一种感觉,这可能是一个愚蠢的问题,但我不能得出我确信存在的简单解决方案 我有一个C#类,它根据其他文件验证配置文件 可能有两种错误,它们在枚举中表示: public enum ErrorType { VersionsMismatch, UnsupportedCombination } 存在表示错误的结构: public struct ValiditionResult { public bool Valid { get; set; }

我有一种感觉,这可能是一个愚蠢的问题,但我不能得出我确信存在的简单解决方案

我有一个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;}
    }
结构表示文件中所需的修复

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

指示发生的所有错误的最佳方式是什么(将来可能有两个以上)


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

您可以用属性[Flags]标记枚举


有关更多信息,请参阅。

您可以使用属性[Flags]标记枚举


有关更多信息,请参阅。

我认为这是打包异常的一个好选择。执行验证并创建要抛出的异常,然后抛出该聚合异常:

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

    if(...)
      yield return new UnsupportedCombinationException(...);
}
然后,无论从哪个方法调用这个validate方法,都只需要有一个
try/catch
块来处理聚合异常,并循环遍历聚合的每个异常并处理它们

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


每个单独的异常都可以有特定于该对象的属性和数据,如果需要,它可以设置自己的消息来显示。

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

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

    if(...)
      yield return new UnsupportedCombinationException(...);
}
然后,无论从哪个方法调用这个validate方法,都只需要有一个
try/catch
块来处理聚合异常,并循环遍历聚合的每个异常并处理它们

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


每个异常都可以具有特定于该对象的属性和数据,并且可以根据需要设置自己的消息以显示。

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

然后,您可以通过类似于
results.Any(vr=>!vr.Valid)
的方式确定验证是否整体失败


另外,代码中是否有解决验证失败的方法?枚举是否驱动代码打包和交付结果的方式/位置?我想知道枚举实现了什么。

如果
ValidationResult
捕获了关于单个验证规则结果的信息,那么返回
List
是有意义的

然后,您可以通过类似于
results.Any(vr=>!vr.Valid)
的方式确定验证是否整体失败


另外,代码中是否有解决验证失败的方法?枚举是否驱动代码打包和交付结果的方式/位置?我想知道枚举实现了什么。

更多信息:在枚举类型下查看位标志。标志很棒,我一直在使用它们。但是,您必须了解您的开发人员受众。如果很多新开发人员都在看这段代码,那么您可能希望使用一个列表。将位运算符与[Flags]枚举一起使用可能会令人困惑,而且可能会被误用。此处的详细信息:将枚举类型视为位标志。标志非常好,我一直都在使用它们。但是,您必须了解您的开发人员受众。如果很多新开发人员都在看这段代码,那么您可能希望使用一个列表。将位运算符与[Flags]枚举一起使用可能会令人困惑,而且可能会被误用。
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
}