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就可以转好了,但是数据中的日 ...
随机推荐
- Hades:移动端静态分析框架
只有通过别人的眼睛,才能真正地了解自己 ——<云图> 背景 作为全球最大的互联网 + 生活服务平台,美团点评近年来在业务上取得了飞速的发展.为支持业务的快速发展,移动研发团队规模也逐渐从零 ...
- liniux Crontab 的重启和设置
重启crontab,service cron restart 05 01 * * * /usr/local/php/bin/php FILE 10,30,50 * * * * /usr/local/p ...
- 【基础知识】Dom基础
[学习日记]Dom基础 1. 内容:使用JavaScript操作Dom进行DHTML开发 2. 目标:能共使用JavaScript操作Dom实现常见的DHTML效果 3. DHTML= C ...
- [BZOJ4561][JLOI2016]圆的异或并(扫描线)
考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...
- 2-SAT的一些题目
http://blog.sina.com.cn/s/blog_64675f540100k2xj.html 都一个类型的不是很想写.
- BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...
- ZOJ 2969 Easy Task
E - Easy Task Description Calculating the derivation of a polynomial is an easy task. Given a functi ...
- [转贴] start-stop-daemon命令
转贴自 http://www.lampblog.net/ubuntu/start-stop-daemon%E5%91%BD%E4%BB%A4/ 1.功能作用 启动和停止系统守护程序 2.位置 /sbi ...
- ASP.NET Web Api 实现数据的分页
前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能会在系列的后期介绍,还没确定...),对于分页的结果,我们将采用2种不同的方式响应给客户端(1.将分 ...
- 用VC资源动态链接库解决国际化问题
http://daixinghe.blog.163.com/blog/static/1843615920097181952979/ 随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的 ...