今天有個網友問我一個問題。
她說她有一個頁面,向資料庫儲存了資料,沒儲存成功,也沒報錯,不知道什麼問題。
我問她啟動並執行時候有什麼異常資訊沒,她說沒有,馬上我感覺到了來自於她的有點不符合常理的嚴峻挑戰。
問她要代碼,發過來了,頓時我無語了。代碼如下:
1 public partial class _Default : System.Web.UI.Page
2 {
3 private string strcon = ConfigurationManager.ConnectionStrings["constr"].ToString();
4
5 protected void Page_Load(object sender, EventArgs e) { }
6
7 protected void Login_Click(object sender, EventArgs e)
8 {
9 OleDbConnection con = new OleDbConnection(strcon);
10 string sql = "insert into text(uname,unickname) values(@uname,@unickname)";
11 OleDbCommand cmd = new OleDbCommand(sql, con);
12 try
13 {
14 cmd.Parameters.AddWithValue("@uname", this.tbUname.Text);
15 cmd.Parameters.AddWithValue("@unickname", this.tbUnickname.Text);
16 con.Open();
17 int i = cmd.ExecuteNonQuery();
18 if (i > 0)
19 {
20 Response.Write("註冊成功");
21 }
22 else
23 {
24 Response.Write("註冊失敗");
25 }
26 }
27 catch (Exception ex)
28 { }
29 finally
30 {
31 con.Close();
32 }
33 }
34 }
35
從上面的代碼,不難看出她沒有儲存成功也沒有報錯的原因。
她使用了一個try{}catch(){}finally{}語句組對資料庫的操作進行異常捕獲,但是捕獲完以後並沒有做任何處理就直接完成了。沒儲存成功,理論上肯定會拋出異常,但她捕獲了異常並沒有進行相應的處理,這當然不可能提示錯誤資訊了。
眾所周知,try{}catch(){}finally{}是一個異常處理機制,它所提供的處理錯誤的機制可以為每種錯誤提供定製的處理,並把識別錯誤的代碼和處理錯誤的代碼分離開來。我們可以使用它來處理應用程式中可以預測到的錯誤。
使用它,就預示著我們要主動對這指定的程式碼片段進行異常處理了,也就是說,catch語句將捕獲try語句塊中出現的指定類型的錯誤,然後使用catch語句塊進行相應的處理操作。
如果catch代碼塊中沒有任何處理語句,就代表我們要放棄對該異常進行處理,也就是說忽略該異常。
在這裡我想說的是,異常處理是一種技術,技術要有選擇的使用,千萬不可濫用。
對異常進行處理是為了加強應用程式的健壯性,而不是每個可能產生異常的程式碼片段中都必需要加異常處理。特別是空的catch語句塊千萬要慎用,除非你真的打算丟掉這個異常資訊,連日誌也不打算記錄一下。
在這裡,我建議初學者在調試這段程式的時候就不要添加異常捕獲的功能了。在這段代碼編寫完成以後,選擇確定拋出異常資訊的語句段進行相應的異常處理。
莫名其妙的異常捕獲代碼,千萬要警惕。