《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. ...
随机推荐
- jQuery应用实例2:表格隔行换色
这里是用JS实现的:http://www.cnblogs.com/xuyiqing/p/8376312.html 接下来利用上一篇提到的选择器利用jQuery实现: 发现原来多行代码这里只需要两行: ...
- 如何在cygwin中运行crontab定时脚本[利刃篇]
用到cygwin,自然是希望能多处理一些类似linux的任务了,那就自然少不了定时任务crontab,看到网上教程不少,自己运行一个测试却也不那么容易,下面就记录我的安装过程,以供参考吧! 1.首先, ...
- Linux - 常用网络操作
001 - Linux CentOS网络配置 CentOS---网络配置详解 002 - Linux查看端口状态 检测本机8080端口状态:netstat –apn | grep 8080 检测192 ...
- linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法
用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...
- 【2019北京集训3】逻辑 树剖+2-sat
题目大意:有一颗有$m$个叶子节点的二叉树. 对于叶子节点$i$,$x[i]=(a[i]\ xor\ V_{p[i]})or(b[i]\ xor\ V_{q[i]})$ 对于非叶子节点$i$,$x[i ...
- [EXP]Microsoft Windows 10 - XmlDocument Insecure Sharing Privilege Escalation
Windows: XmlDocument Insecure Sharing Elevation of Privilege Platform: Windows (almost certainly ear ...
- Spring Boot 2.0正式发布,新特性解读
作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...
- JavaSE-关键字final
final修饰数据: final修饰基本数据类型,使数值恒定不变,修饰对象引用,final使引用恒定不变 final修饰的成员变量必须要被初识化 final可以修饰方法中的参数列表,被修饰的参数无法在 ...
- Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
椭圆曲线密码学(Elliptic curve cryptography),简称 ECC,是一种建立公开密钥加密的算法,也就是非对称加密,ECDH 与 ECDSA 是基于 ECC 的算法.类似的还有 R ...
- 《Kubernetes权威指南》——运维技巧
1 Node的隔离和恢复 方法1: 创建新的Node配置文件指定spec.unschedulable: true 通过kubectl replace完成对Node的状态修改 kubectl repla ...