C# 处理验证方法错误消息的好方法
我编写了一个许可证系统,它检查许可证的不同方面(例如开始日期、结束日期、系统限制等)。在这个示例中,我在许可证中有一个限制,即不能创建超过5个用户帐户。我有一个方法(例如bool NumberOfUsersIsCoveredByLicense),它调用一个公共方法(例如bool IsValidLicense)。IsValidLicense将检查许可证文件是否被操纵、过期等 现在的问题是错误输出。正如您所看到的,我有一些返回值为bool的方法,因此我知道存在许可证冲突,但我不知道许可证检查的哪一部分失败了。 所以我在想,如何返回一个值,它描述了许可证的哪一部分被违反。最简单的方法是返回一个字符串值,我会这样做C# 处理验证方法错误消息的好方法,c#,error-handling,licensing,C#,Error Handling,Licensing,我编写了一个许可证系统,它检查许可证的不同方面(例如开始日期、结束日期、系统限制等)。在这个示例中,我在许可证中有一个限制,即不能创建超过5个用户帐户。我有一个方法(例如bool NumberOfUsersIsCoveredByLicense),它调用一个公共方法(例如bool IsValidLicense)。IsValidLicense将检查许可证文件是否被操纵、过期等 现在的问题是错误输出。正如您所看到的,我有一些返回值为bool的方法,因此我知道存在许可证冲突,但我不知道许可证检查的哪一部
var licenseValidationResult = NumberOfUsersIsCoveredByLicense(4)
if(licenseValidationResult.Equals(String.Empty))
{
//Success
}
else
{
ErrorMessage = GetErrorMessageByErrorCode(licenseValidationResult);
}
因此,如果许可证有效,我将返回一个空字符串,如果它无效,它将以类似error1的形式返回错误代码;错误2;错误3。。我不确定这是不是一个好的解决方案。另一种可能是枚举,类似这样:
[Flags]
public enum LicenseErrorCodes
{
None = 0x00,
LicenseExpired = 0x01,
LicenseManipulated = 0x02,
MaxNumberOfUsersReached = 0x04,
[...]
}
但是,我不确定这是否是一个好的解决方案。有什么“通用方法”/“最佳实践”可以解决这样的问题吗?如果您认为许可证违规被视为失败或错误,那么在异常失败时抛出异常可能是合理的
因此,请定义您的
InvalidLicenseException
如果许可证违规被认为是失败或错误,那么在异常失败时抛出异常可能是合理的
因此,请定义您的
InvalidLicenseException
如何使用。因此,您仍然可以为成功或失败返回布尔值,但也可以向isValidLicence方法添加out messageString参数。或者定义一个许可证违规类别并使用它。使用如何。因此,您仍然可以为成功或失败返回布尔值,但也可以向isValidLicence方法添加out messageString参数。或者定义一个许可证冲突类别并使用它。如果您想限制可能的无效状态,使用枚举是可以的。这将允许您的UI等处理每个可能的状态。如果您的验证系统中有许多不同的状态,那么我建议只创建一个包含相关信息的验证类,并从validatior返回这些信息,例如:
static IValidationInfo Validate(ILicense someLic)
{
// Implementation
}
interface IValidationInfo
{
IEnumerable<LicenseErrorCodes> KnownErrors { get; }
IEnumerable<string> WierdErrors { get; }
}
静态IValidationInfo验证(ILicense someLic)
{
//实施
}
IValidationInfo接口
{
IEnumerable Knownerror{get;}
IEnumerable WierdErrors{get;}
}
创建类是一个轻量级的过程,因此与建议的“out”解决方案相比,性能方面的考虑将是最小的
编辑:
此外,我还建议不要对验证器使用异常。至少对我来说,验证器应该被设计成接受输入并验证它。让使用者处理它抛出的任何无效数据错误,而不必在try{}catch{}块中这样做。异常只应用于使用者无法直接处理的不可预测/外部问题,例如文件访问问题或COM失效。如果要限制失效的可能状态,可以使用枚举。这将允许您的UI等处理每个可能的状态。如果您的验证系统中有许多不同的状态,那么我建议只创建一个包含相关信息的验证类,并从validatior返回这些信息,例如:
static IValidationInfo Validate(ILicense someLic)
{
// Implementation
}
interface IValidationInfo
{
IEnumerable<LicenseErrorCodes> KnownErrors { get; }
IEnumerable<string> WierdErrors { get; }
}
静态IValidationInfo验证(ILicense someLic)
{
//实施
}
IValidationInfo接口
{
IEnumerable Knownerror{get;}
IEnumerable WierdErrors{get;}
}
创建类是一个轻量级的过程,因此与建议的“out”解决方案相比,性能方面的考虑将是最小的
编辑:
此外,我还建议不要对验证器使用异常。至少对我来说,验证器应该被设计成接受输入并验证它。让使用者处理它抛出的任何无效数据错误,而不必在try{}catch{}块中这样做。异常只应用于消费者无法直接处理的不可预测/外部问题,例如文件访问问题或COM失效。事实上,我认为无效许可证被视为错误是很有趣的。.是的,“错误”可能是错误的词。事实上,这不是一个错误。。所以它应该被称为“LicenseViolationCodes”或类似的东西。我将看看您之前建议的策略模式。事实上,我认为将无效许可证视为错误是很有趣的。是的,“error”可能是错误的词。事实上,这不是一个错误。。所以它应该被称为“LicenseViolationCodes”或类似的东西。我来看看你早些时候建议的战略模式。。虽然答案是赞成的,但我个人会考虑在不同的州申请许可证,而不是把它当作一个错误。虽然答案是赞成的,但我个人会考虑申请在不同的州处理许可证,而不是把它当作一个错误。谢谢你的意见。我想我将使用枚举法。。如前所述,它使应用程序能够立即处理许可证中的所有错误。我正在考虑在我的应用程序中正确处理枚举。(也许我可以用枚举中的活动标志创建一条错误消息,并创建一个元组作为输出值)感谢您的意见。我想我将使用枚举法。。如前所述,它使应用程序能够立即处理许可证中的所有错误。我正在考虑如何正确处理ap中的枚举