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 中的三种引号的作用

    1. 单引号(' ') 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用. 2. 双 ...

  2. 初识Telerik for AJAX

    由于项目需要,本人又刚入门.net开发,项目经理介绍了一个.net流行的开发框架telerik.于是我开始慢慢学习了,发现这个控件还是不错的,学习到的内容和初学者一起探讨一下. 1:第一步 什么是te ...

  3. vue 项目记录.路飞学城(一)

    前情提要: 通过vue 搭建路飞学城记录  一:项目分析 二:项目搭建 1:创建项目 vue init webpack luffy 2:初始化项目 清除默认的HelloWorld.vue组件和APP. ...

  4. VMware12 安装 Ubuntu18.04

    安装Ubuntu18.04虚拟机 Ubuntu获取地址: 官网:https://www.ubuntu.com/download/server 清华镜像站:https://mirrors.tuna.ts ...

  5. Jenkins之使用Pyinstaller构建Python应用程序

    目录 1. 极简概述 2. Jenkins配置 2.1 安装JDK 2.2 安装Jenkins 3. 安装Docker 4. 使用PyInstaller构建Python应用程序 4.1 Fork 一个 ...

  6. SQL 必知必会·笔记<4>使用通配符过滤数据

    LIKE操作符 通配符(wildcard): 用来匹配值的一部分的特殊字符. 百分号(%)通配符 最常使用的通配符是百分号(%).在搜索串中,%表示任何字符出现任意次数: SELECT prod_id ...

  7. 【杂谈】对IO与NIO的认识

    IO流与NIO块的数据缓存 Java的IO是面向流设计的,通常我们通过IO流读取数据,只能指定读取数据的大小,而不能选择数据读取的起始位置.数据就像流水一样,流过我们的应用,一旦流过就无法回头.除非我 ...

  8. Java 的字节流文件读取(二)

    接着上篇文章,我们继续来学习 Java 中的字节流操作. 装饰者缓冲流 BufferedInput/OutputStream 装饰者流其实是基于一种设计模式「装饰者模式」而实现的一种文件 IO 流,而 ...

  9. springboot + freemarker 实现国际化

    前言 写过一篇springboot+freemarker国际化过程中的细节问题,但没有写过具体的国际化实现过程.正好有人在问,我就把我实现的过程贴出来,即使自己知识的一个备份,如果对别人有点用,那是再 ...

  10. 【NET CORE微服务一条龙应用】应用部署

    简介 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 本章主要介绍https://github.com/q315523275/FamilyBucket上微服务一条龙应用,在实际使用中的应用 ...