《InsideC#》笔记(十) 异常处理
CLR的作用之一是处理异常。通过自动的内存和资源管理可以避免一部分异常,然后借助强类型系统还可以捕获运行时异常。
一 异常基础
异常处理系统保护四个关键字:try,catch,throw,finally。但某处方法出现运行错误,无法继续执行时,这个方法通过throw关键字先调用者抛出一个异常。调用者如果有异常处理的代码,它就会通过catch关键字捕获这个异常,并对异常进行处理。
a) 通过throw抛出的异常都是派生自System.Exception的对象,throw new Exception()会实例化一个Exception对象并抛出到调用堆栈。
b)异常可以被抛出,就需要对应的捕获方法:try-catch。如果没有特殊指定,catch默认会捕获所有的异常类型。被try包围的代码块一旦出现异常,就会跳转到catch代码块。如果某个方法出现了异常,它的调用者没有写异常处理代码,异常就会沿着调用堆栈一层层向上抛去,直到抛到有异常处理代码的方法被捕获为止,如果异常没能被捕获,程序就会中止。
c)有时一个调用者捕获到了异常,做了力所能及的处理后,还要进一步往上层抛出,可以在catch代码中再次使用throw。
d)为了保证使用了异常处理的方法代码不论执行成功还是异常都可以运行,要在finally代码块中做最后的处理,如内存或资源的释放。
二 System.Exception
所有的异常类型都派生至System.Exception,而且并没有在基类的基础上扩展任何方法,但为什么不只是使用一种System.Exception类型就够了呢,因为一个try可以接多个catch,用以捕获不同类型的异常。
a) System.Exception类的构造函数有如下几个:
第一种无参;第二种可以指定错误消息。异常被捕获后,在Exception.Message属性中可以拿到错误消息;第三种可以传递一个被序列化的异常对象;最后一种可以传递错误消息和内部异常(inner exception),那么最后抛出的异常同时会带有内部异常。通过e.InnerException属性可以获取到。
b) 堆栈跟踪
System.Exception还有一个非常有用的属性StackTrace,借助堆栈跟踪可以更容易地定位问题。
c) 捕获多种异常
针对每种可能的异常编写catch代码快,便可对特定的异常做各自的处理。但需要注意的是,System.Exception基类异常要放在最后一个catch处理,派生异常放在前面,否则无法编译通过。
d) 不需要为每个可能出错的地方都编写异常,过多的异常会代码维护困难和,因为只要在程序崩溃前捕获住异常就没有问题,所以可以基于这一点做一些设计上的优化。
《InsideC#》笔记(十) 异常处理的更多相关文章
- SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver
Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射.数据绑定以及目标方法运行时发生的异常. SpringMVC 提供的 Handl ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...
- java jvm学习笔记十(策略和保护域)
欢迎转载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271415 前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也 ...
- 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- WCF 学习笔记之异常处理
WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...
- Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
随机推荐
- 使用onpaste粘贴事件引起的探索
前天项目有一个需求,在Excel文档里面直接复制商品编码,然后粘贴到页面空白处就把相应的数据加载出来.当时我是懵逼的,不知道如何下手. 以前没遇到过类似的需求,后来才想起onpaste事件 在使用on ...
- django xlwt实现资产导出功能
做个记录 views import xlwt class ExAssetView(LoginRequiredMixin,View): def get(self,request): row = 1 st ...
- Linux学习笔记之十————Linux常用服务器构建之ftp服务器
p服务器介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件的双向传输. 同时,它也是一个应用程序(Ap ...
- 线程的中断(Lock与synchronized)
Thread包含interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的中断状态.如果一个线程已经被阻塞,或者试图执行一个阻塞操作.那么设置这个线程的中断状态将 抛出Interru ...
- 06-TypeScript中的表达式
TypeScript中提供了箭头表达式,通过箭头表达式可以简化我们的编码. 1.箭头表达式简化匿名函数 在JS中,我们通常使用匿名函数,匿名函数实际上是赋值给一个变量,常见的写法如下: var sun ...
- IMSI
国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有 ...
- 如何将打包好的文件做成一个APP
本文主要是用来简短的对做成一个APP进行说明,内容可能不是多详细,但会给出具体思路.(仅供参考) 因为各种打包和生成APP的方式多样,今天这里仅仅对用Hbuilder打包进行说明. 1.首先当然需要一 ...
- 可重入锁 & 不可重入锁
可重入锁指同一个线程可以再次获得之前已经获得的锁,避免产生死锁. Java中的可重入锁:synchronized 和 java.util.concurrent.locks.ReentrantLock. ...
- EntityFramework使用总结(与MVC4.0实现CURD操作)
本篇文介绍一下Entity Framework Code First的简单用法,通过一个学生信息的增删查改来学习Entity Framework的使用及与存储过程的交互.我也是学习Entity Fra ...
- RabbitMQ在分布式系统中的应用
怎么保证可靠性的? RabbitMQ提供了几种特性,牺牲了一点性能代价,提供了可靠性的保证. 持久化当RabbitMQ退出时,默认会将消息和队列都清除,所以需要在第一次声明队列和发送消息时指定其持久化 ...