天天看点

设计三层异常如何处理?

前言

      在敲到三层已经成功的时候突然发现了一个不完美的地方,那就是如果你输入错误的话,按照原来代码的意思是直接跳到出错的地方会有一个提示,验收的时候师傅希望我可以运用一个异常处理进行修正,但是很不幸本人经过了尝试,虽然没有用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解决异常问题,一定请留言告诉我,有大礼相送!