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#》笔记(十) 异常处理的更多相关文章

  1. SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver

    Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射.数据绑定以及目标方法运行时发生的异常. SpringMVC 提供的 Handl ...

  2. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  3. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  4. java jvm学习笔记十(策略和保护域)

    欢迎转载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271415 前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也 ...

  5. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...

  6. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  7. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  9. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

随机推荐

  1. Java学习笔记48(DBUtils工具类一)

    上一篇的例子可以明显看出,在增删改查的时候,很多的代码都是重复的, 那么,是否可以将增删改查封装成一个类,方便使用者 package demo; /* * 实现JDBC的工具类 * 定义方法,直接返回 ...

  2. ELKstack简介及环境部署

    ELK工作流程图 环境准备 安装Logstash依赖包JDK Logstash的运行依赖于Java运行环境, Logstash 1.5以上不低于java 7推荐使用最新版本的Java.由于只是运行Ja ...

  3. SpringBoot初探(上传文件)

    学了Spring,SpringMVC,Mybatis这一套再来看SpringBoot,心里只有一句握草,好方便 这里对今天做的东西做个总结,然后在这之间先安利一个热部署的工具,叫spring-DevT ...

  4. jQuery事件委托

    jQuery事件委托 <ul id="ulBox"> <li data-id="1"></li> <li data-i ...

  5. DevExpress GridControl小结

    1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...

  6. Java工程师学习指南 初级篇

    Java工程师学习指南 初级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  7. Spring Security使用报错 No bean named 'springSecurityFilterChain' is defined

    今天配置spring security时,运行报出No bean named 'springSecurityFilterChain' is defined错误,报错信息如下 严重: Exception ...

  8. window下安装绿色版5.7

    1. 在mysql的安装目录下创建my.ini,并配置必要参数. 2. 执行命令mysqld --initialize-insecure --basedir=/opt/mysql/mysql  --d ...

  9. 【PyTorch深度学习60分钟快速入门 】Part4:训练一个分类器

      太棒啦!到目前为止,你已经了解了如何定义神经网络.计算损失,以及更新网络权重.不过,现在你可能会思考以下几个方面: 0x01 数据集 通常,当你需要处理图像.文本.音频或视频数据时,你可以使用标准 ...

  10. DNS Wildcard(DNS泛域名)

    在DNS中,泛域名(wildcard Resource Record)可以被认为是一种合成RR的机制,借助于它,DNS服务器可以响应本来不存在的域名的请求,它的设计初衷是用来把所有邮件都转发到一个邮件 ...