异常类

在C#里,异常处理就是C#为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标志错误的代码预处理错误的代码分离开来.

对.net类来说,一般的异常类System.Exception派生于System.Object.还有许多定义好的异常类(例如:System.SystemExpection,SYstem.ApplicationException等),他们又派生于System.Exception类.其中System.ApplicationException类是第三方定义的异常类,如果我们要自定义异常类,那么就应派生于它.

在代码中对异常进行处理,一般要使用三个代码块:

第一个代码块:Try块的代码是程序中可能出现错误的操作部分.

第二个代码块是:Catch块的代码块用来处理各种错误的部分(可以有多个).必须正确排列捕获异常的catch子句,范围小的Exception放在前面的catch.即如果Exception之间存在继承关系,就应把子类的Exception放在前面的catch子句中

第三个代码块:finally快的代码用来倾力资源或执行要在try块末尾执行的其他操作(可以省略).且无论是否产生异常,Finally块都会执行.

异常处理

不管程序写的多好,异常都有可能发生,而程序也必须能够处理异常.所以我们要站在异常一定可能会发生的角度来编写异常处理程序,应对程序有可能发生的错误建立一个良好的异常处理策略.

异常产生的时候,我们想知道是什么情况导致了错误或异常.我们可以根据实际情况抛出具体类型的异常,方便捕捉到异常时做出具体的处理.在编写代码的过程中,可以使用系统已经定义好的相关异常类以及自定义的异常类,=来实例化并抛出我们需要的异常.如一个不可能实现的接口,我们可以抛出”System.NotSupportedException”的异常来告诉接口的调用者.

在处理异常的时候,我们应该将可处理的具体异常分别在catch块中做出相应处理,否则程序将终止运行.针对每一个异常,以不同的方式处理,避免对所有异常做出一样的处理.就像医生不能给孕妇和感冒开一样的药.我们在开开药的时候,是不是会被告诉一次吃多少,忌冷啥的注意事项,相同的道理,在异常产生的时候,需要给用户一个有好的提示(普通用户对异常的具体内容是不明白,这就需要我们给出相关的简要信息和解决方案,或告之联系方式,例如,我们怀孕了,怀孕的原理是啥?是什么导致怀孕?怀孕产生的效果是啥?咱们一般人可能不知道,我们只能收出现孕吐的情况了,咋办,找医生,咱们只是知道孕吐这是不正常的,这就出现了异常),并在可能的情况下给用户提供可能的选择(终止,重试,忽略),让用户来决定从程序的运行方法.同时,要将异常做日志记录(病例).但不是所有的异常都必须记录的,比如一些可预料并且能让程序解决的错误我们就不需要记录它.

记录异常我们可以采取以下方式:

1.在文件中记录异常,便于技术人员查看发生了什么情况,从而能改进程序.

2.在数据库中记录异常.数据库支持查询,这样在后期就能够对异常进行分类查询等操作,便于查看与管理

3.在Eventlog中记录:能够远程操作,方便系统管理员监控所有计算的异常.

除了具体的,可预料的异常外,(后面我要说啥?你猜?),还有未预料的错误,这类错误通常我们不愿意看到,但是肯定会发生,就像医生不愿意看到癌症的病例一样(因为代表着这个人不行了,应声通常希望大家都能好好的活着,别出现什么大病,我们还是要相信这个世界上还有好医生).但是这些不愿意看到的异常也只能暂时结束程序的运行,这里如果做好了日志就能为我们解决和调试问题带来了方便.还有,要避免使用try-catch但没有处理异常的情况,否则就相当于给异常放行(你有病,医生告诉你改则治,你不治.这就不行了,那你还去看医生干啥,,耽误医生救死扶伤).

处理完异常后,我们还要注意在finally块中释放资源,还原相关设置信息等收尾工作,也就是你的病好了以后,需要办理出院手续,和护士姐姐告个别.

在做异常处理的时候,最好能在应用程序所有的入口处(事件处理函数,主函数,线程入口)使用try-catch.但是不要在程序构造函数入口处添加try-catch,因为此处产生异常,他自己并没有能力处理,因为他还没有构造完毕,只能再想外层抛出异常.

在一般的情况下使用异常处理机制来处理错误,能是整个程序的结构清晰,代码简单(标志错误的代码预处理错误代码分离),但我们也不能盲目使用异常.而且使用异常,可能会在一定程度上影响程序的性能(C#中使用异常一般不会影响性能).对于一些简单的,能够提前避免的错误,我们还是应该在try块外面及早做出处理.

了解了基础的东西,再来看一下C#异常类相关总结

需要知道的是C#中所有的异常类,不管使自定义的,还是系统定义的,他们的基类都是Exception

另外说一下C#常见的异常类(没必要记住):知道有这么回事,你可以不看,不记,但是我不能不写.

异常类名

说明

SystemException

该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)

ApplicationException

该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)

与参数相关的异常类

ArgumentException

该类用于处理参数无效的异常,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称。

FormatException

该类用于处理参数格式错误的异常

与成员访问有关的异常

MemberAccessException

该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)

MemberAccessException

见下备注

与数组相关的异常类

IndexOutOfException

该类用于处理下标超出了数组长度所引发的异常

ArrayTypeMismatchException

该类用于处理在数组中存储数据类型不正确的元素所引发的异常

RankException

该类用于处理维数错误所引发的异常

与IO有关的异常类

IOException

该类用于处理进行文件输入输出操作时所引发的异常。详细见下备注

与算数相关的异常类

ArithmeticException

该类用于处理与算术有关的异常,详细见下备注

备注:

MemberAccessException类的直接派生类:

i、FileAccessException类:该类用于处理访问字段成员失败所引发的异常

ii、MethodAccessException类:该类用于处理访问方法成员失败所引发的异常

iii、MissingMemberException类:该类用于处理成员不存在时所引发的异常

IOException类的5个直接派生类:

i、DirectionNotFoundException类:该类用于处理没有找到指定的目录而引发的异常。

ii、FileNotFoundException类:该类用于处理没有找到文件而引发的异常。

iii、EndOfStreamException类:该类用于处理已经到达流的末尾而还要继续读数据而引发的异常。

iv、FileLoadException类:该类用于处理无法加载文件而引发的异常。

v、PathTooLongException类:该类用于处理由于文件名太长而引发的异常。

ArithmeticException类的派生类:

i、DivideByZeroException类:表示整数货十进制运算中试图除以零而引发的异常。

ii、NotFiniteNumberException类:表示浮点数运算中出现无穷打或者非负值时所引发的异常。

C#编程(八十)---------- 异常类的更多相关文章

  1. C#编程(八十二)---------- 用户自定义异常类

    用户自定义异常类 前面已经说了不少关于异常的问题了,现在来给大家说一下自定义异常时咋个回事以及咋样. 为啥会出现自定义异常类呢?用用脚趾头想想也明白,是为了定义咱们自己的异常,自定义异常类继承自App ...

  2. C#高级编程八十二天----用户自己定义异常类

    用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样.   为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...

  3. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 菜鸟学Java(十八)——异常

    每个学编程的人在编程的过程中都会遇到各种异常.那么当我们遇到异常的时候该怎么处理呢?针对不同的异常我们又该采取什么具体的处理方式呢?这些问题在我开始学编程的很长一段时间里我都不太清楚,还好随着不断的学 ...

  5. 【读书笔记】C#高级编程 第十六章 错误和异常

    (一)简介 错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为应用程序的最终用户引发或运行代码的环境而发生错误.C#提供了异常处理机制来处理错误. (二)异常类 在C#中,但刚出现某个特殊的 ...

  6. 不为人知的网络编程(八):从数据传输层深度解密HTTP

    1.引言 在文章<理论联系实际:Wireshark抓包分析TCP 3次握手.4次挥手过程>中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用.这就是传说中的锤 ...

  7. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

随机推荐

  1. C#面向对象(基础知识)

    面向对象:就是CLASS,class就是用户自定义类型: class:用户自定义引用类型:三大特点:封装.继承.多态: 解决方案中右键添加class:class内可以写结构体,枚举,函数: C#中各个 ...

  2. JS实现数组去重(重复的元素只保留一个)

    1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: ,,,,,,,,]; func ...

  3. cf796c 树形,思维题

    一开始以为是个树形dp,特地去学了..结果是个思维题 /* 树结构,设最大点权值为Max,则答案必在在区间[Max,Max+2] 证明ans <= Max+2 任取一个点作为根节点,那么去掉这个 ...

  4. 通过Headless模式执行selenium脚本

    我们在通过Selenium运行自动化测试时,必须要启动浏览器,浏览器的启动与关闭必然会影响执行效率,而且还会干扰你做其它事情(本机运行的话) Chrome Headless模式 Python Sele ...

  5. springMVC3学习--ModelAndView对象(转)

    原文链接:springMVC3学习(二)--ModelAndView对象 当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherS ...

  6. Myeclipse如何使用自带git工具向远程仓库提交代码

    先看一下Myeclipse自带的git工具  本人是在码云上面注册的账号,上面有项目的仓库,将仓库的项目克隆到本地之后,在myeclipse中导入该项目. 那么如何将修改后的代码再提交到码云上面? 第 ...

  7. bootstrapTable 参数说明

  8. PKUWC2019游记&&WC2019游记

    今天好颓,不想写代码了,写写游记 PKUWC2019游记&&WC2019游记 PKUWC2019游记 提前两天就来了中山纪中,考了两天模拟,第一天比较正常,但是可做题只有T3,第二天非 ...

  9. Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  10. 001 LRU-缓存淘汰算法

    1.介绍 LRU是LeastRecentlyUsed近期最少使用算法.内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,Oracle会根据哪些数据属于LRU而将其移出内存而 ...