博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
十、C# 异常处理
阅读量:5978 次
发布时间:2019-06-20

本文共 2784 字,大约阅读时间需要 9 分钟。

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           checked2             {3                 int n = int.MaxValue;4                 n = n + 1;5                 Console.WriteLine(n);6             }

 

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

 

输出:
-2147483648
 
在不允许使用语句的时候(比如在初始化时候,还可使用checked和unchecked表达式)
1 int n = unchecked(int.MaxValue + 1);

 

 
 

转载于:https://www.cnblogs.com/tlxxm/p/4604542.html

你可能感兴趣的文章
Install Python3 on a Mac
查看>>
Android 四种launchMode及疑问
查看>>
【九度OJ1523】从上往下打印二叉树
查看>>
一款jQuery立体感动态下拉导航菜单特效
查看>>
IOS开发的基础知识
查看>>
Android 绘制字符串到自定义view的中心
查看>>
php7.1微信公众平台消息安全模式的加密及解密
查看>>
Redis使用总结
查看>>
linux MD5
查看>>
为社会做点回馈吧
查看>>
消除各类乱码的方法
查看>>
搜索框(SearchView)的功能与用法
查看>>
js有别于java的一些语法(了解)
查看>>
重新学习ubuntu -- 学习UEFI 引导安装系统
查看>>
spring AOP
查看>>
MySQL中SYSDATE()和NOW()的区别
查看>>
飞康CDP训练营 免费学习
查看>>
CSS派生选择器
查看>>
四舍五入保留两位小数--Java
查看>>
jdbc@1521:orcl和jdbc@1521/orcl的区别
查看>>