天天看點

設計三層異常如何處理?

前言

      在敲到三層已經成功的時候突然發現了一個不完美的地方,那就是如果你輸入錯誤的話,按照原來代碼的意思是直接跳到出錯的地方會有一個提示,驗收的時候師傅希望我可以運用一個異常處理進行修正,但是很不幸本人經過了嘗試,雖然沒有用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解決異常問題,一定請留言告訴我,有大禮相送!