C#:处理返回值中的错误组合
我有一种感觉,这可能是一个愚蠢的问题,但我不能得出我确信存在的简单解决方案 我有一个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; }
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
}