基礎才是(shi)重中之重~開發人員(yuan)應用(yong)學會(hui)用(yong)throw
無(wu)論是(shi).net還是(shi)java,在開發(fa)程(cheng)序時(shi)都難免會用到throw關鍵字,對于初學者(zhe)一(yi)(yi)般(ban)會認為它(ta)與(yu)try...catch捆綁在一(yi)(yi)起,這(zhe)當然是(shi)錯(cuo)誤的,事實上,throw的一(yi)(yi)個(ge)最重要(yao)的作(zuo)用就是(shi):
讓程(cheng)序告(gao)訴(su)用(yong)戶(hu)一些事情,這些事情一般(ban)是開發人員之(zhi)前(qian)定義好的,如(ru)對于(yu)一個輸入(ru)文本框,你(ni)需(xu)要輸入(ru)給(gei)定數字(zi),但如(ru)果輸入(ru)的不是給(gei)定的數據范(fan)圍,則可以(yi)通過throw告(gao)訴(su)用(yong)戶(hu)!
讓程序告訴開發人員一(yi)些事情,這些事情一(yi)般(ban)是底層開發人員之前定義好的,如果一(yi)些業務規(gui)范,如果開發人員輸(shu)入(ru)的不合法,程序就會(hui)拋出一(yi)個(ge)異(yi)常,以告訴表層開發人員!
下面是一個程(cheng)序中的throw用法:
if (vp.ContainsKey("flag")) { int flagValue; int.TryParse(vp["flag"].ToString(), out flagValue); switch (flagValue) { case 0: linq = linq.Where(i => i.EndTime > DateTime.Now); break; case 1: linq = linq.Where(i => i.EndTime <= DateTime.Now); break; case 2: //...break; default: throw new ArgumentException("參數不正確"); } }
上面的代碼(ma),由前臺用(yong)戶(hu)傳入一(yi)(yi)個(ge)(ge)參(can)數(shu),這邊于(yu)程序處理,這里不考慮擴展,所以(yi)(yi)使用(yong)了switch塊(對于(yu)業務(wu)多變的情(qing)況(kuang)下,我們可以(yi)(yi)使用(yong)策略(lve)模式(shi),工廠模式(shi)去(qu)代替switch這個(ge)(ge)代碼(ma)壞(huai)味(wei)道),當(dang)你輸入的參(can)數(shu)不到(dao)給定(ding)的case條件時,就會向上拋(pao)出(chu)異常,以(yi)(yi)告訴(su)用(yong)戶(hu)!當(dang)然(ran)默(mo)認情(qing)況(kuang)下會以(yi)(yi)黃屏的樣子(zi)出(chu)現,我們運營的系統,當(dang)然(ran)會做一(yi)(yi)些處理。
.net mvc為我們提供的(de)(de)實例項目,是這樣使用throw關鍵字的(de)(de),看代(dai)碼:
public bool ValidateUser(string userName, string password) { if (String.IsNullOrEmpty(userName)) throw new ArgumentException("值不(bu)能為 null 或(huo)為空(kong)。", "userName"); if (String.IsNullOrEmpty(password)) throw new ArgumentException("值不能為 null 或為空。", "password"); return _provider.ValidateUser(userName, password); }
好(hao)了,對于throw的解說(shuo)就(jiu)到(dao)這(zhe)里,今天做項目正好(hao)用到(dao)這(zhe)個,所以(yi)就(jiu)總結了一下,希(xi)望給(gei)你會帶來(lai)一點(dian)點(dian)幫助,呵呵。