C# 调试登录代码
我有一些登录功能的代码。我无法在try语句中识别return语句,而try语句似乎是放置return语句的唯一逻辑位置。其中,返回语句当前允许用户登录,即使密码不正确。如果我将return语句放在其他任何地方,我会收到错误,但并非所有代码路径都会返回一个值C# 调试登录代码,c#,C#,我有一些登录功能的代码。我无法在try语句中识别return语句,而try语句似乎是放置return语句的唯一逻辑位置。其中,返回语句当前允许用户登录,即使密码不正确。如果我将return语句放在其他任何地方,我会收到错误,但并非所有代码路径都会返回一个值 public static User selectUser(string userName, string password) { // code to validate user try
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;
}
您应该仅在成功场景中返回用户对象,否则返回null。为了确定是否已对用户进行身份验证,请在使用selectUser方法时检查user object vs 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;
}
在视图逻辑而不是业务逻辑中处理异常 大概是这样的:
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();
}
}
请注意,此解决方案不需要调用代码来表示方法的结果
-更新-
现在只捕获InvalidUserName或PasswordException
-更新2-
我想说的一点是,基于异常的编程被建议并作为解决方案被接受。为了进一步的参考,通读是以一种有趣且有点讽刺的方式进行解释的
调用此函数后,请检查返回值是否为NullOfEmptyaUser。如果存在至少一个不返回变量的流,则UsernameYes C将不允许您使用 用户类型的。 您的代码应该可以正常工作,因为它确实返回了User类型的变量。 你应该做的是,不要在你的函数中显示消息 在您调用它的位置执行它,只需尝试捕捉 阻塞调用语句,以便知道调用时发生了什么 用户不存在函数返回的对象必须具有 您可以从中查看的属性 在这种情况下,您可能可以在if-else条件下检查函数返回值
要相应地显示消息MSDN在解释您得到的错误代码时有一个非常好的错误示例- 您的示例有多个代码路径,这意味着根据if/try语句中的条件执行的命令序列 以下是可能的主要路径: 用户有效,无异常:try块,消息框1,函数结束 用户无效,无异常:try块,消息框2,函数结束 验证期间出现异常:try bloc、catch块、函数结束 如果您仅从某些代码路径(如问题中的1和2)返回结果,并从函数末尾删除return,则3个代码路径中只有2个具有return语句
在您的情况下,修复可能是始终返回null;在函数末尾,使用返回ValidateUser跳出;从您拥有有效用户对象的位置。我无法在try语句中识别return语句,您所说的已识别是什么意思?您是否遇到编译器错误?不需要添加thankyounotes,而且我已经从示例中删除了一些不相关的代码…大多数建议的答案都使用异常处理,并且仍然需要调用代码来处理结果。我更新了我被否决的答案来解释我自己。希望它能帮助OP避免基于异常的编程之类的解决方案…您的代码与原始代码有完全相同的问题不是所有的代码路径都返回值…您还必须添加一个返回null;while循环后的语句。如果DbReader没有返回任何行,您必须返回null,因此无法登录。@AlexeiLevenkov检查我的更新答案,我不知道还有另一个If阻止此帖子,这些评论使我走上了正确的轨道。我还通过将打开下一个表单的代码从表示层移动到我发布的代码中的if语句来解决这个问题。我现在差不多明白了!谢谢大家的帮助。我现在觉得很好@用户1729696,很明显您的字符串密码命名错误,因为它应该包含密码的哈希。。。如果不好的做法,吃所有的例外……即使这确实解决了问题,这也是一个糟糕的建议。您正在为流控制使用异常。真正的答案是他根本不应该捕获基异常类。@CodyGray啊,你说得对。误读了这个问题,注意到一些sql的东西,没有意识到他在做他认为应该做的一切。我的观点是,他不应该在他的业务逻辑中处理异常,而应该在他的观点中处理它。@CodyGray仍然相信这是错误的解决方案吗?有趣的什么,因为我几分钟内没有回应,你以为我还是认为这是错误的解决方案?不一定。。。有时我只是从键盘上起来。无论如何,这是更好的,但您仍然使用异常进行流控制。我想这是一个有争议的风格问题,但大多数人普遍认为这不是最好的方式。如果没有与指定参数匹配的有效用户,为什么SelectUser方法不能返回null?那么就没有理由抛出并立即捕获异常了。@CodyGray,因为我们依赖于异常,OP在他的问题中决定,然后使用它们f
或者它们的目的是控制流量。我对建议答案的问题是,异常在SelectUser方法内部处理,只是将结果设置为null,然后强制调用方对结果进行if-else处理。最后,异常旨在控制流。不要像建议和接受的那样以基于异常的编程方式使用它……如果您避免使用u、ur和thr SHRTNGF txt,您的答案会很好。
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;
}