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