將不(bu)確(que)定變為確(que)定~異常(chang)被拋出的順序
在程(cheng)序中,為了保(bao)正代碼的(de)嚴禁性我(wo)們(men)會在需要的(de)地方加個(ge)try...cache塊,作(zuo)用是(shi)對(dui)(dui)一(yi)個(ge)已知或者未知的(de)異常(chang)進(jin)行捕獲,這(zhe)是(shi)正常(chang)的(de),任何一(yi)種(zhong)面向(xiang)對(dui)(dui)象的(de)語(yu)言(yan)都提供了這(zhe)個(ge)基(ji)礎的(de)功能,C#也(ye)不例(li)外(wai),事實上這(zhe)篇文章的(de)重要是(shi),對(dui)(dui)于比(bi)較深度的(de)方法(fa)調用中,異常(chang)被(bei)拋(pao)出的(de)順序。
下面代(dai)碼塊中(zhong),WEB層調用(yong)(yong)BLL層方(fang)法(fa),而(er)BLL層方(fang)法(fa)去調用(yong)(yong)DAL層方(fang)法(fa),而(er)在這三個層的(de)三個方(fang)法(fa)中(zhong)都加了try...catch塊,而(er)在BLL與DAL中(zhong)我會故意讓(rang)程序產生一個已知的(de)異常,并進(jin)行捕獲,最后(hou)進(jin)行日(ri)志的(de)寫入。
看代碼:
1 static void DAL() 2 { 3 int a = 0; 4 try 5 { 6 int b = 1 / a; 7 } 8 catch (Exception e) 9 { 10 11 ErrMsg.Append(e.Message); 12 13 } 14 } 15 16 static void BLL() 17 { 18 try 19 { 20 DAL(); 21 test t = null; 22 Console.WriteLine(t.nam); 23 } 24 catch (Exception e) 25 { 26 27 ErrMsg.Append(e.Message); 28 } 29 } 30 31 static void WEB() 32 { 33 try 34 { 35 BLL(); 36 } 37 catch (Exception e) 38 { 39 40 ErrMsg.Append(e.Message); 41 } 42 }
調用代碼:
static void Main(string[] args) { WEB(); Console.WriteLine(ErrMsg.ToString()); }
結果如下:
從結果上看(kan)出(chu),異(yi)常是按著產生的順(shun)序而依次被記錄的。
而別一種情況,如果我們不(bu)去捕獲(huo)異常(chang),它(ta)(ta)是否可以自己捕獲(huo)呢?答(da)案是否定的,它(ta)(ta)當然不(bu)能捕獲(huo),呵呵!
1 static void DAL() 2 { 3 int a = 0; 4 try 5 { 6 int b = 1 / a; 7 } 8 catch (Exception e) 9 { 10 11 //ErrMsg.Append(e.Message); 12 13 } 14 } 15 16 static void BLL() 17 { 18 try 19 { 20 DAL(); 21 test t = null; 22 Console.WriteLine(t.nam); 23 } 24 catch (Exception e) 25 { 26 27 // ErrMsg.Append(e.Message); 28 } 29 } 30 31 static void WEB() 32 { 33 try 34 { 35 BLL(); 36 } 37 catch (Exception e) 38 { 39 ErrMsg.Append(e.Message); 40 } 41 }
結果如下: