1、多异常类型
2、捕捉异常
3、常规catch块
4、异常处理的指导原则
5、定义自定义异常
 
1、多异常类型
代码要引发任何异常,只需为要引发的异常实例实例附加关键字throw作为前缀。具体选择的异常类型
应该能够最好地说明异常发生的背景。
 
 
2、捕获异常
通过引发一具特定的异常类型,可以让类型本身来识别问题。
C#允许使用多个catch块,每个块都面向一个特定的异常类型。

  1. try
  2. {
  3. TemporaryFileStream fileStream = new TemporaryFileStream();
  4. //Use temporary file stream;
  5.  
  6. //..
  7.  
  8. fileStream.Dispose();
  9.  
  10. //..
  11. }
  12. catch (NullReferenceException e)
  13. {
  14.  
  15. }
  16. catch (ArgumentException e)
  17. {
  18. }
  19. catch (InvalidCastException e)
  20. {
  21. }
  22. catch (SystemException e)
  23. {
  24. }
  25. catch (Exception e)
  26. {
  27. }
每个块都处理一个不同的异常类型。
一个异常发生的时候,会跳转到与异常类型最匹配的catch块执行(从上往下匹配是否符合)
匹配度是由继承来决定的。例如,即使引发的是System.Exception类型的异常,由于System.ApplicationException派生自
System.Exception,因此System.ApplicationException与引发的异常匹配度最高。
最终将由 catch (ApplicationException e)块处理。
catch块必须按照从具体到最常规的顺序排列,以避免编译错误。
注:catch块并非一事实上需要一个命名的参数。事实上,最后一个catch块,甚至连类型参数都可以不要。
 
空catch块的内部原理
与一个空catch块相对应的CIL代码是一个catch(object)块。这意味着不管引发什么类型,空catch块都能捕捉到它。
 
异常处理的指导原则
。。。。待学习
 
3、定义自定义异常
定义一个自定义异常时,从System.Exception或者其他异常类型派生就可以了。
 
可以参照公司的
自定义异常唯一的硬性要求就是它必须从System.Exception或者某个子类派生。除此之外,在使用自定义异常的时候,还就遵照
以下最佳实践
所有异常都应该使用"Exception"后缀,彰显其用途。
通常,所有异常都应该包含以下3个构造器:无参数构造器,获取一个string参数的构造器以及同时获取一个字符串
和一个内部异常作为参数的构造器。
避免使用深的继承层次结构(一般应该小于5级)
重新引发一个异常时,假如重新引发的异常与捕捉到的异常不同,内部异常就会发挥重要的作用。可以将异常保存到
InnerException属性中。
 
 
 
4、可序列化异常
可序列化对象:是“运行时”可以持久化成一个流(如一个文件流),然后忱个流来重新实例化的对象。
在异常的情况下,一些分布通信技术可能需要它。
为了支持序列化,异常声明就包含System.SerializableAttribute这个特性,或者应该实现 
Iserializable。
除此之外,它们必须包含一个构造器来获取System.Runtime.Serialization.SerializationInfo和
System.Runtime.Serialization.StreamingContext作为参数。
 
定义一个可序列化异常

  1. //支持可序列化异常
  2. [Serializable]
  3. class DataBaseException : System.Exception
  4. {
  5. public DataBaseException(System.Runtime.Serialization.SerializationInfo serializationInfo,
  6. System.Runtime.Serialization.StreamingContext context)
  7. {
  8.  
  9. }
  10.  
  11. }
5、checked与unchecked
在checked块内,如果在运行时发生一次溢出的赋值,就会引发一个异常。
在unchecked块内,它会将数据截断,而不是为块中的赋值引发异常

  1. checked
  2. {
  3. int n = int.MaxValue;
  4. n = n + ;
  5. Console.WriteLine(n);
  6. }
运行时,提示  n = n + 1;
算术运算导致溢出

  1. unchecked
  2. {
  3. int n = int.MaxValue;
  4. n = n + ;
  5. Console.WriteLine(n);
  6. Console.Read();
  7. }
输出:
-2147483648
 
在不允许使用语句的时候(比如在初始化时候,还可使用checked和unchecked表达式)
  1. int n = unchecked(int.MaxValue + );
 
 

十、C# 异常处理的更多相关文章

  1. Java基础学习笔记十八 异常处理

    什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...

  2. [Abp 源码分析]十、异常处理

    0.简介 Abp 框架本身针对内部抛出异常进行了统一拦截,并且针对不同的异常也会采取不同的处理策略.在 Abp 当中主要提供了以下几种异常类型: 异常类型 描述 AbpException Abp 框架 ...

  3. python学习 (三十二) 异常处理

    1 异常: def exceptionHandling(): try: a = b = d = a / b print(d) except ZeroDivisionError as ex: print ...

  4. python学习笔记(十五)-异常处理

    money = input('输入多少钱:') months = input('还几个月:') try: res = calc(int(money),int(months)) except ZeroD ...

  5. VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

    上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还 ...

  6. VS2010-MFC(MFC常用类:MFC异常处理)

    转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C ...

  7. python_way day15 HTML-DAY2 HTML-DAY2、JS

    python_way day15 HTML-DAY2 html-css回顾 javascript 一.html-css回顾 1.input与+,-号的写法 <!DOCTYPE html> ...

  8. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  9. [Abp 源码分析]零、文章目录

    0.系列文章目录 一.Abp 框架启动流程分析 二.模块系统 三.依赖注入 四.模块配置 五.系统设置 六.工作单元的实现 七.仓储与 Entity Framework Core 八.缓存管理 九.事 ...

  10. [Abp 源码分析]十一、权限验证

    0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证.在 Abp 框架内部,权限分为两块,一个是功能(Featu ...

随机推荐

  1. 两个月淘宝刷单,连续死N次血泪史 (转)

    两个月淘宝刷单,连续死N次血泪史 派代网 2014/10/13 刷单 分享到:3 [思路网注] 看来是靠刷流量刷销量是行不通了,点击率与展现无法匹配,这是致命的!!那么,贵就贵点,直通车来吧!!再删宝 ...

  2. HDOJ/HDU 2551 竹青遍野(打表~)

    Problem Description "临流揽镜曳双魂 落红逐青裙 依稀往梦幻如真 泪湿千里云" 在MCA山上,除了住着众多武林豪侠之外,还生活着一个低调的世外高人,他本名逐青裙 ...

  3. openStack 性能开测-2

  4. jQuery各种效果举例

    jQuery 所有jQuery详细使用说明请见:http://www.php100.com/manual/jquery/ jQuery的作用是操作浏览器html,从而达到用户的可视化效果,按照功能可分 ...

  5. iOS高级工程师面试

    1. 你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?  Objecitve- ...

  6. 【原创】javascript——事件思维导图

  7. delphi tidhttp 超时的解决方案

    现在delphi都发布到xe10.1了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTime ...

  8. 计算机体系结构 -内存优化vm+oom

    http://www.cnblogs.com/dkblog/archive/2011/09/06/2168721.htmlhttps://www.kernel.org/doc/Documentatio ...

  9. LINUX内核调度器+linux 内存

    http://www.cnblogs.com/tolimit/p/4303052.html

  10. JAVA大集合数据分批次进行切割处理

    今天遇到一个大集合里面的数据删除问题, 因为是一个大集合,如果同时传递到数据库,那么就会造成数据库压力 所以分批次的进行批量操作 其实 也可以采用多线程来处理或者多批次加多线程来处理都是可以的 下面的 ...