Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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#_Exception - Fatal编程技术网

C# 抛出异常还是只返回字符串?

C# 抛出异常还是只返回字符串?,c#,exception,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

假设我有一个检查用户详细信息的函数

//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;
}
//检查有效用户的详细信息。
私有bool checkUserDatails(字符串昵称、字符串组ID)
{
//检查昵称
if((昵称==null | |昵称.Trim().Equals(“”))
{
返回false;
}
//检查组ID
if(groupId==null)
返回false;
//转换为整数
int-id;
尝试
{
id=int.Parse(groupId);
}
catch(异常){return false;}
//核对身份证
如果(id<0 | id>100)
返回false;
返回true;
}
它工作得很好,但是调用方函数不知道为什么函数返回false。我最初的想法是创建我自己的异常,比如
incorrectionSernameException
等,然后抛出它们。我也可以创建返回值字符串,只返回“不正确的用户名”


正确的C#方法是什么?

您不应该抛出异常,因为返回值
false
可能会非常频繁。这将导致相当大的性能下降。例如,您可以使用一个,其值为
correct
invalid\u昵称
invalid\u 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
}

您不应该抛出异常,因为返回值
false
可能会非常频繁。这将导致相当大的性能下降。例如,您可以使用一个,其值为
correct
invalid\u昵称
invalid\u 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
}

按照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.");
    }
}

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

按照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.");
    }
}

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

if(String.IsNullOrWhiteSpace(昵称))返回false有两篇关于正确异常处理的文章,我链接了很多。它们可能会帮助您:|除了那些检查的函数部分之外,您的代码中还有很多问题。此外:我们在这里缺少了太多的内容,无法进行完整的评估。用户详细信息来自。。。某处。无论在哪里,您都需要一些东西来读取该信息、解析信息或创建对象。这是该代码的位置,该操作的上下文将决定代码的外观。它也会去某个地方。。。可能是个物体。构造该对象是此代码的另一个位置,或者可能是作为该对象一部分的验证方法或属性。
if(String.IsNullOrWhiteSpace(昵称))返回false有两篇关于正确异常处理的文章,我链接了很多。它们可能会帮助您:|除了那些检查的函数部分之外,您的代码中还有很多问题。此外:我们在这里缺少了太多的内容,无法进行完整的评估。用户详细信息来自。。。某处。无论在哪里,您都需要一些东西来读取该信息、解析信息或创建对象。这是该代码的位置,该操作的上下文将决定代码的外观。它也会去某个地方。。。可能是个物体。构建该对象是该代码的另一个地方,或者可能是作为该对象一部分的验证方法或属性。“返回值false可能会非常频繁。”请解释您从何处获得该信息,因为OP从未提及任何与此非常接近的内容。没有参考资料?你应该看看一些c#指南。
out
关键字必须在需要时使用,而不是用于返回messages@CamiloTerevinto它会检查用户的详细信息,这些信息可能是用户输入的。一般来说,您不能假设用户总是做出正确的输入,因此用户详细信息可能会经常无效。“返回值false可能会经常发生。”请解释您从何处获得该信息,因为OP从未提及任何与此相近的内容。没有参考资料?你应该看看一些c#指南。
out
关键字必须在需要时使用,而不是用于返回messages@CamiloTerevinto它会检查用户的详细信息,这些信息可能是用户输入的。一般来说,你不能假设用户总是做出正确的输入,因此很可能经常出现用户详细信息无效的情况。这种约定称为防御性编码。对于你给他们的东西,一种方法应该是防御性的。所以,当你给出的参数不正确时,它应该抛出一个错误来防止错误的发生。@CodeNotFound,所以它被称为防御性编码。。。谢谢。在您的答案中添加一条旁注可能会有所帮助,因为只需在参数声明中将groupId的类型更改为int,而无需解析为int。@CodeNotFound我不完全确定是否推荐它,这就是为什么我在结尾添加了注释。这种约定称为防御编码。对于你给他们的东西,一种方法应该是防御性的。所以,当你给出的参数不正确时,它应该抛出一个错误来防止错误的发生。@CodeNotFound,所以它被称为防御性编码。。。谢谢。在你的答案中加上一条旁注可能会有帮助,因为只需在参数声明中将groupId的类型更改为int,而无需解析为int。@CodeNotFound我不是完全正确的