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. Shell-5--位置参数变量

  2. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  3. Testing - 软件测试知识梳理 - 测试流程

    测试存在于各个阶段: 需求测试--->单元测试--->集成测试--->系统测试--->性能测试--->用户测试--->回归测试 需求测试 完整性&正确性 一 ...

  4. Liferay平台开发使用详细PPT演示文稿

    主要章节: 概述 功能和使用 开发扩展 安全.认证 高可用 Demo 独立流程演示工程: Liferay集成Activiti开发工程: PPT演示文稿下载 Demo程序分2部分: 独立流程演示工程:h ...

  5. Virtualbox+Vagrant环境准备

    环境准备 所需软件 下载地址 VirtualBox-5.2.8-121009-Win https://download.virtualbox.org/virtualbox/5.2.12/Virtual ...

  6. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  7. Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试

    Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试 会撸码的小马 关注 2018.05.29 17:30* 字数 212 阅读 1488评论 0喜欢 2 接到上一章, ...

  8. Flask源码复习之路由

    构建路由规则 一个 web 应用不同的路径会有不同的处理函数,路由就是根据请求的 URL 找到对应处理函数的过程. 在执行查找之前,需要有一个规则列表,它存储了 url 和处理函数的对应关系.最容易想 ...

  9. 通过GitHub和GoDaddy搭建静态个人博客

    一.创建GitHub个人主页 通过GitHub创建个人博客的好处:无广告,因为页面代码全是你自己写的:免费,不用买主机:装X:设计和编码练习. 1. 在GitHub上创建一个新的repository, ...

  10. Vim 多行剪切、复制和删除

    剪切 快捷键方式: dd:剪切光标所处当前行 n + dd:剪切光标所在行及以下共 n 行 按 p 粘贴在光标所在行 命令行方式: 例如剪切1到10行,并粘贴在12行处: 1,10 m 12 复制 快 ...