C#异常处理及心得
C sharp中的异常用于处理系统级和应用程序级的错误状态,它是一种结构化、统一的类型安全的处理机制。c#的异常 机制非常类似于c++的异常处理机制,但是还是有一些重要的区别:
1,在 C# 中,所有的异常必须由从 System.Exception 派生的类类型的实例来表示。在 C++ 中,可以使用任何类型的任何值表示异常。
2,在 C# 中,利用 finally 块可编写在正常执行和异常情况下都将执行的终止代码。在 C++ 中,很难在不重复代码的情况下编写这样的代码。
3,C# 中,系统级的异常如溢出、被零除和 null 等都对应地定义了与其匹配的异常类,并且与应用程序级的错误状态处于同等地位。
1.1 导致异常的原因
可以以两种不同的方式引发异常。
· throw 语句(第 8.9.5 节)用于立即无条件地引发异常。控制永远不会到达紧跟在 throw 后面的语句。
· 在执行 C# 语句和表达式的过程中,有时会出现一些例外情况,使某些操作无法正常完成,此时就会引发一个异常。例如,在整数除法运算(第 7.8.2 节)中,如果分母为零,则会引发 System.DivideByZeroException。有关可能以此方式引发的各种异常的列表,请参见第 16.4 节。
1.2 System.Exception 类
System.Exception 类是所有异常的基类型。此类具有一些所有异常共享的值得注意的属性:
· Message 是 string 类型的一个只读属性,它包含关于所发生异常的原因的描述(易于人工阅读)。
· InnerException 是 Exception 类型的一个只读属性。如果它的值不是 null,则它所引用的是导致了当前异常的那个异常,即表示当前异常是在处理那个 InnerException 的 catch 块中被引发的。否则,它的值为 null,则表示该异常不是由另一个异常引发的。以这种方式链接在一起的异常对象的数目可以是任意的。
这些属性的值可以在调用 System.Exception 的实例构造函数时指定。
1.3 异常的处理方式
发生异常时,系统将搜索可以处理该异常的最近的 catch 子句(根据该异常的运行时类型来确定)。首先,搜索当前的方法以查找一个词法上包含着它的 try 语句,并按顺序考察与该 try 语句相关联的各个 catch 子句。如果上述操作失败,则在调用了当前方法的方法中,搜索在词法上包含着当前方法调用代码位置的 try 语句。此搜索将一直进行下去,直到找到可以处理当前异常的 catch 子句(该子句指定一个异常类,它与当前引发该异常的运行时类型属于同一个类或是该运行时类型所属类的一个基类)。注意,没有指定异常类的 catch 子句可以处理任何异常。
找到匹配的 catch 子句后,系统将把控制转移到该 catch 子句的第一条语句。在 catch 子句的执行开始前,系统将首先按顺序执行嵌套在捕捉到该异常的 try 语句里面的所有 try 语句所对应的全部 finally 子句。
如果没有找到匹配的 catch 子句,则发生下列两种情况之一:
· 如果对匹配的 catch 子句的搜索到达一个静态构造函数(第 10.12 节)或静态字段初始值设定项,则在导致调用该静态构造函数的代码位置引发 System.TypeInitializationException。该 System.TypeInitializationException 的内部异常将包含最初引发的异常。
· 如果对匹配的 catch 子句的搜索到达最初启动当前线程的代码处,则该线程的执行就会终止。此类终止会产生什么影响,应由实现来定义。
特别值得注意的是在析构函数执行过程中发生的异常。如果在析构函数执行过程中发生异常且该异常未被捕获,则将终止该析构函数的执行,并调用它的基类的析构函数(如果有)。如果没有基类(如 object 类型中的情况),或者如果没有基类析构函数,则该异常将被忽略。
1.1 公共异常类
下列异常由某些 C# 操作引发。
1 |
System.ArrayTypeMismatchException |
当存储一个数组时,如果由于被存储的元素的实际类型与数组的实际类型不兼容而导致存储失败,就会引发此异常。
1 |
System.DivideByZeroException |
在试图用零除整数值时引发。
1 |
System.IndexOutOfRangeException |
在试图使用小于零或超出数组界限的下标索引数组时引发。
1 |
System.InvalidCastException |
当从基类型或接口到派生类型的显式转换在运行时失败时,就会引发此异常。
1 |
System.NullReferenceException |
在需要使用引用对象的场合,如果使用 null 引用,就会引发此异常。
1 |
System.OutOfMemoryException |
在分配内存(通过 new)的尝试失败时引发。
1 |
System.OverflowException |
在 checked 上下文中的算术运算溢出时引发。
1 |
System.StackOverflowException |
当执行堆栈由于保存了太多挂起的方法调用而耗尽时,就会引发此异常;这通常表明存在非常深或无限的递归。
1 |
System.TypeInitializationException |
在静态构造函数引发异常并且没有可以捕捉到它的 catch 子句时引发。
okay上文的内容就是对c#语言规范中对于异常处理的总结,下面总结一下我们这些新手经常出现的问题,请高手们补充,谢谢!
一、是否缺少 using 指令或程序集引用?
这是我在最近的探索中经常遇到的问题,虽然已经添加引用了,但是总会提示,很折磨的说,我总结了两种较为通常的处理:
1、修改:右击类文件--属性--生成操作--将“内容”改为“编译”,然后重新生成,问题解决。
2、另一种情况:项目中存在多个类库,生成项目时提示 未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?) ,找到相应类库中的“引用”文件夹,在其中添加对应的dll文件,单独生成此类库,若还是提示,则需要查看“引用”中是否有引用其他类库所生成的dll文件,如果存在,则需要先确保生成该dll文件的类库可以正常生成,以此类推,最终生成整个项目。
二、try,catch,finally
我是这样理解的,先执行try里面的语句,如果try里面的语句抛出了错误,就会被catch捕获,所以就会中断try里面语句的执行转而执行catch里面的语句,如果try里面的语句都执行完了也没有抛出错误,那么catch里的语句就没有机会执行了。最后不论try顺利运行完毕,还是try抛出了错误被catch语句捕获并执行了catch的语句都要接着执行finally里面的语句。但是总感觉缺点什么~
这里给出一个msdn上的最佳异常处理方法,希望会有所帮助。
http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx
C#异常处理及心得的更多相关文章
- 【全网最全】springboot整合JSR303参数校验与全局异常处理
一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全.因为前端很容易拜托,当测试使 ...
- 关于MySQL存储过程异常处理的一点心得
DROP PROCEDURE IF EXISTS `SP_MODEL`; DELIMITER ;;CREATE PROCEDURE `SP_MODEL`(IN V_TYPE INT)BEGIN /** ...
- 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...
- mysql+tomcat+spring 配置心得(从0开始搭环境)
前几天公司竞一个标要做个POC,前端AugularJs做mobile界面,后端Spring MVC做Restful API供前端调用. 时间紧急,大家都忙,so我这个不写代码的闲人花一上午配了一套Sp ...
- windows类书的学习心得(转载)
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 朱晔的互联网架构实践心得S2E1:业务代码究竟难不难写?
注意,这是我的架构实践心得的第二季的系列文章,第一季有10篇你也可以回顾. 见https://www.cnblogs.com/lovecindywang/category/1296779.html 最 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 异常处理与MiniDump详解(1) C++异常(转)
异常处理与MiniDump详解(1) C++异常 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一. 综述 我很少敢为自己写 ...
- DELPHI 异常处理2
今天在写用ADO从EXCEL导入数据的程序时,出现个错误,弄了很久都弄不好,最后还是用异常处理解决掉了. 数据中日期在导入之前要转换成日期格式,虽然说一个strtodate就可以转好了,但是数据中的日 ...
随机推荐
- 1006 Sign In and Sign Out (25)(25 point(s))
problem At the beginning of every day, the first person who signs in the computer room will unlock t ...
- android handler messageQueue,looper
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 处理器获取 当前线程中的 循环器对象, 循环器 从 消息队列中 取出 消息, 给 处理器 ...
- Splay和LCT的复杂度分析
\(Splay\)的复杂度分析 不论插入,删除还是访问,我们可以发现它们的复杂度都和\(splay\)操作的复杂度同阶,只是一点常数的区别 我们不妨假设有\(n\)个点的\(splay\),进行了\( ...
- [WC2014]时空穿梭(莫比乌斯反演)
https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D=1}^{m_1}\sum\limits_{d|D}C_{d-1 ...
- STL 优先队列详解
优先队列是一个保证队列里元素单调的队列,我们可以利用它来维护一个线性结构的单调性. 一般的优先队列: 当然需要加头文件 #include <queue> priority_queue &l ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表
BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 9619 Solved: 3287 题目连接 ht ...
- HDU 4268 Alice and Bob 贪心STL O(nlogn)
B - Alice and Bob Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- HDU 3161 Iterated Difference 暴力
Iterated Difference Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- .NET面试宝典-基础
经典.net面试题目 建议使用朗读女软件下载,边读边记. 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有 ...
- AppDelegate 方法介绍
// // AppDelegate.swift // SwifyDemo import UIKit import CoreData @UIApplicationMain // 入口函数 UIApp ...