前言
在敲到三层已经成功的时候突然发现了一个不完美的地方,那就是如果你输入错误的话,按照原来代码的意思是直接跳到出错的地方会有一个提示,验收的时候师傅希望我可以运用一个异常处理进行修正,但是很不幸本人经过了尝试,虽然没有用try-catch解决,但是终于还是有方法,可以分享给大家!
内容
一:主要的三层的代码就不说了,主要涉及的是在BLL层和UI层中处理的代码,源代码如下:
<span style="font-size:18px;">n</span><span style="font-size:14px;">amespace login.BLL
{
public class loginManager
{
public<span style="color:#cc0000;"> Login.model.userInfo </span>userlogin(string userName, string Password)
{
DAL.userDAO uDao = new DAL.userDAO(); //呼叫数据源。
Login.model.userInfo user = uDao.selectUser(userName, Password); //处理的情况返还给user
if (user!=null) //判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
{
DAL.ScortDAO sdo = new DAL.ScortDAO();
sdo.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登陆失败");
}
}
}
}
namespace loginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btlogin_Click(object sender, EventArgs e)
{
string userName = txtusername.Text.Trim();
string Password = txtpassword.Text.Trim();
login.BLL.loginManager mgr = new login.BLL.loginManager();
Login.model.userInfo user= mgr.userlogin(userName, Password);
MessageBox.Show("登陆用户:" + user.UserName);
}
}
}
如果输入错误,就会出现如下的代码:
其实这种代码不叫出错,而是你对于异常处理的方式不同,只是将异常抛出了,但是没有对异常进行处理而已,我不知道大家是如何对这个情况进行处理,我只是在想用try-catch去处理,但是遇到了阻碍。因为大家关心一下上面我用红色字体标出来的代码,都是需要具有这样的返回值login.model.userinfo才可以的就地进行处理的,否则就会报出如下的错:
其实这时候我们就必须要正视这个问题,那就是无论我们在BLL层做出了什么样的逻辑判断,我们都必须对UI抛出一个数,让U层进行显示,但是如果我们不改变抛出的数据,我们将必须永远将错误的情况,也就是user为null值的时候进行抛出去给U层,这样永远也是无法达到我们的要求。所以我们索性就对BLL层的函数进行修改,让它可以抛出我们想要抛出的,
二:修改BLL层后,源代码修改如下:
<strong><span style="font-size:18px;color:#ff0000;">UI层</span></strong>
<span style="font-size:12px;">namespace loginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btlogin_Click(object sender, EventArgs e)
{
string userName = txtusername.Text.Trim();
string Password = txtpassword.Text.Trim();
string message;
message = "";
login.BLL.loginManager mgr = new login.BLL.loginManager();
Login.model.userInfo user= mgr.userlogin(userName, Password, ref message);
MessageBox.Show(message);
}
}
}</span>
<strong><span style="font-size:18px;color:#ff0000;">BLL层</span></strong>
<span style="font-size:10px;">namespace login.BLL
{
public class loginManager
{
public Login.model.userInfo userlogin(<span style="color:#990000;">string userName, string Password, ref string message</span>)
{
DAL.userDAO uDao = new DAL.userDAO(); //呼叫数据源。
Login.model.userInfo user = uDao.selectUser(userName, Password); //处理的情况返还给user
if (user != null) //判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
{
DAL.ScortDAO sdo = new DAL.ScortDAO();
sdo.UpdateScore(userName, 10);
message = "登陆成功了用户";
}
else
{
message = "用户名或密码有误";
}
return user;
}
}
}</span>
这是一种方法:我上网查了一下,out和ref的用处其实和return的用处差不多,在UI中我故意避开了对于user的处理,其实user为null还是存在,只是用户看不到了而已。我 参考博客是: 简单三层登陆
三:当我用c#的try-catch语言尝试进行,但是却出现没有我想要的结果:
<strong><span style="font-size:18px;color:#ff0000;">BLL层</span></strong>
<span style="font-size:10px;">namespace login.BLL
{
public class loginManager
{
public Login.model.userInfo userlogin(string userName, string Password, ref string message)
{
DAL.userDAO uDao = new DAL.userDAO(); //呼叫数据源。
Login.model.userInfo user = uDao.selectUser(userName, Password); //处理的情况返还给user
//if (user != null) //判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
//{
try
{
DAL.ScortDAO sdo = new DAL.ScortDAO();
sdo.UpdateScore(userName, 10);
message = "登陆成功了用户";
}
catch (NullReferenceException )
{
message = "用户名或密码有误";
}
return user;
}
}
}</span>
因为在输入错误的用户名或者是密码的时候都是可以显示“登陆成功”,我很是郁闷,调试的结果发现根本就不走这一步,我感到了很悲伤,真是不知道如何是好,还是请教一下大家吧,看我哪里失败不是理解的有问题啊!
总结:
其实在这个刚开始遇到这个问题的时候我是将user抛到了UI层,在UI层进行了判断,虽然结果是成功了,但是将判断的语句呈现给UI层是不合理的,因为它只是起一个界面的作用,而这样做会曲解了这样的u层含义,所以在敲三层的时候最主要的就是理清楚各自的只能问题。对于我遗留下来的问题,将在以后的学习中继续去探索,如果大家已经使用try-catch解决异常问题,一定请留言告诉我,有大礼相送!