抛出异常或只返回一个字符串?

时间:2018-05-12 21:43:53

标签: c# exception

假设我有此功能检查用户详细信息

//check valid user's details.
private bool checkUserDatails(String nickname, String groupId)
{
    //check nickname
    if ((nickname == null || nickname.Trim().Equals("")))
    {
        return false;
    }

    //check groupId
    if (groupId == null)
        return false;

    //convert to int
    int id;
    try
    {
        id = int.Parse(groupId);
    }
    catch (Exception) { return false; }

    //check id
    if (id < 0 | id > 100)
        return false;

    return true;
}

它工作得很好,但调用函数不知道函数返回false的原因。我最初的想法是创建我自己的例外,例如IncorrectUsernameException等,并扔掉它们。我也可以创建返回值字符串,只返回“不正确的用户名”。

正确的C#方法是什么?

2 个答案:

答案 0 :(得分:2)

遵循Microsoft约定(至少在某些地方),这应该如下所示:

private void EnsureValidDetails(string nickname, string groupId)
{
    if (string.IsNullOrWhiteSpace(nickname))
    {
        throw new ArgumentNullException(nameof(nickname));
    }
    else if (string.IsNullOrEmpty(groupId))
    {
        throw new ArgumentNullException(nameof(groupId));
    }

    int parsedGroupId;

    if (!int.TryParse(groupId, out parsedGroupId))
    {
        // or some better wording
        throw new ArgumentException("GroupId is not a valid number."); 
    }

    if (parsedGroupId < 0 || parsedGroupId > 100)
    {
        throw new ArgumentOutOfRangeException("GroupId must be between 0 and 100.");
    }
}

请注意,此方法的功能超出了应有的范围。 groupId应该是int参数,并且该方法应该只检查有效范围内的值:

private void EnsureValidDetails(string nickname, int groupId)
{
    if (string.IsNullOrWhiteSpace(nickname))
    {
        throw new ArgumentNullException(nameof(nickname));
    }
    else if (groupId < 0 || groupId > 100)
    {
        throw new ArgumentOutOfRangeException("GroupId must be between 0 and 100.");
    }
}

然而,这可能不是实际验证此类内容的最佳方式。它当然是一种通用的,独立于框架的方式,但是一些.NET框架(WPF,WCF,WinForms,ASP.NET)提供了内置的方法来实现这一点。

答案 1 :(得分:0)

您不应该抛出异常,因为很可能经常会返回值false。这会导致性能下降。相反,您可以使用enum,其值为correctinvalid_nicknameinvalid_id等。

enum CheckUserDetailsResult { correct, invalid_nickname, invalid_id }

或者,您可以通过out参考提供消息:

private bool checkUserDetails (String nickname, String groupId, out String message)
{
    if (String.IsNullOrEmpty (nickname))
    {
        message = "Invalid nickname!";
        return false;
    }
    //and so on
}