Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理验证方法错误消息的好方法_C#_Error Handling_Licensing - Fatal编程技术网

C# 处理验证方法错误消息的好方法

C# 处理验证方法错误消息的好方法,c#,error-handling,licensing,C#,Error Handling,Licensing,我编写了一个许可证系统,它检查许可证的不同方面(例如开始日期、结束日期、系统限制等)。在这个示例中,我在许可证中有一个限制,即不能创建超过5个用户帐户。我有一个方法(例如bool NumberOfUsersIsCoveredByLicense),它调用一个公共方法(例如bool IsValidLicense)。IsValidLicense将检查许可证文件是否被操纵、过期等 现在的问题是错误输出。正如您所看到的,我有一些返回值为bool的方法,因此我知道存在许可证冲突,但我不知道许可证检查的哪一部

我编写了一个许可证系统,它检查许可证的不同方面(例如开始日期、结束日期、系统限制等)。在这个示例中,我在许可证中有一个限制,即不能创建超过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中的枚举