将不确定变为确定~异常被抛出的顺序
在程序中,为了保正代码的严禁性我们会在需要的地方加个try...cache块,作用是对一个已知或者未知的异常进行捕获,这是正常的,任何一种面向对象的语言都提供了这个基础的功能,C#也不例外,事实上这篇文章的重要是,对于比较深度的方法调用中,异常被抛出的顺序。
下面代码块中,WEB层调用BLL层方法,而BLL层方法去调用DAL层方法,而在这三个层的三个方法中都加了try...catch块,而在BLL与DAL中我会故意让程序产生一个已知的异常,并进行捕获,最后进行日志的写入。
看代码:
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()); }
结果如下:
从结果上看出,异常是按着产生的顺序而依次被记录的。
而别一种情况,如果我们不去捕获异常,它是否可以自己捕获呢?答案是否定的,它当然不能捕获,呵呵!
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 }
结果如下: