将不确定变为确定~异常被抛出的顺序
在程序中,为了保正代码的严禁性我们会在需要的地方加个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 }
结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2012-01-12 谁说LINQ复杂查询不支持返回实名类型~定义实体有讲究