0

我有一些登录功能的代码。我无法在 try 语句中识别 return 语句,这似乎是唯一合乎逻辑的放置它的地方。当前返回语句所在的位置允许用户登录,即使密码不正确也是如此。如果我将 return 语句放在其他任何地方,我会收到错误“并非所有代码路径都返回值”。

    public static User selectUser(string userName, string password)
    {
       // code to validate user
        try
        {
                if (isUserValid)
                {
                    MessageBox.Show("Login successful!");
                }
                else
                {
                    MessageBox.Show("Login failed");
                }
            }
        }
        catch (Exception e)
        {
             MessageBox.Show(e.ToString());
        }
        return aUser;
    }
4

5 回答 5

3

您应该仅在成功的情况下返回用户对象,否则返回 null。为了确定用户是否已通过身份验证,在使用 selectUser 方法时检查用户对象与 null

User aUser = null;
try {
            while (dbReader.Read())
            {
                if (dbReader.HasRows)
                {
                    MessageBox.Show("Login successful!");
                    aUser = new User();
                }
                else
                {
                    MessageBox.Show("Login failed");
                }
            }
        }

catch (Exception e) {
                        MessageBox.Show(e.ToString());
                    }
finally {
          return aUser;
}
于 2013-03-16T06:29:30.130 回答
3

MSDN 在解释您得到的错误代码时有很好的错误示例 - CS0161

您的示例有多个“代码路径” - 表示根据 if/try 语句中的条件执行的命令序列。

以下是主要的可能路径:

  1. 用户有效,无异常:try 块、消息框 1、函数结束
  2. 用户无效,无例外:尝试块、消息框 2、函数结束
  3. 验证期间的异常:try bloc、catchblock、end of function

如果您仅从某些代码路径(即问题中的 1 和 2)返回结果并return从“函数结束”中删除,则 3 个代码路径中只有 2 个将具有 return 语句。

在您的情况下,修复可能是始终在函数结束时从您拥有有效用户对象的地方return null;跳出。return validatedUser;

于 2013-03-16T06:41:50.930 回答
2


    public static User selectUser(string userName, string password)
    {
        User aUser = new User();
        if (sConnection.State == ConnectionState.Closed)
            sConnection.Open();
        OleDbCommand cmd = sConnection.CreateCommand();
        OleDbDataReader dbReader = null;
        string sql = "SELECT * FROM [User] WHERE ([userName]='" + userName + "' AND [Password]='" + password + "')";
                        cmd.CommandText = sql;
            dbReader = cmd.ExecuteReader();
        try
        {
            while (dbReader.Read())
            {
                if (dbReader.HasRows)
                {
                    MessageBox.Show("Login successful!");
                    aUser.UserName = username;
                    return aUser;
                }
                else
                {
                    MessageBox.Show("Login failed");
                    aUser.UserName =string.empty;
                }
            }
        }
        catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                aUser.UserName = string.empty;
            }
        return aUser;
    }

调用此函数后,检查返回 IsNULLofEmpty(aUser.Username)

于 2013-03-16T06:36:41.133 回答
2

是的,如果至少存在一个不返回 User 类型变量的流,C# 将不允许您这样做。您的代码应该可以正常工作,因为它确实返回了 User 类型的变量。你应该做的是,不要在你的函数中显示消息,在你调用它的地方实现它,只需在调用语句周围放置一个 try catch 块,这样你就知道当用户不存在时发生了什么(对象函数返回的必须有一些你可以检查的属性)

在这种情况下,您可能可以在 if else 条件下检查函数返回值以相应地显示消息

于 2013-03-16T06:40:32.577 回答
-1

在您的视图逻辑中而不是在您的业务逻辑中处理异常。

像这样的东西:

class View
{
    public void Login(string username, string password)
    {
        try
        {
            var user = _users.SelectUser(username, password);
            MessageBox.Show(
                string.Format("valid user: {0}", user.UserName));
        }
        catch (InvalidUserNameOrPasswordException)
        {
            MessageBox.Show("Invalid username or password");
        }
    }
}

public class Users
{
    public User SelectUser(string userName, string password)
    {
        if (!ValidUser)
        {
            throw InvalidUserNameOrPasswordException();
        }

        return new User();
    }
}

请注意,此解决方案不需要if-else方法的结果调用代码。

- 更新 -

现在只捕获 InvalidUserNameOrPasswordException

-- 更新2 --

我要说明的一点是,建议并接受基于异常的编程作为解决方案。如需进一步参考,请通读这篇(讽刺的)帖子,其中以有趣且有点讽刺的方式解释了基于异常的编程。

于 2013-03-16T06:31:39.633 回答