异常类

在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. mysql的undo log和redo log

    在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件,有这么两 ...

  2. poj 1321 棋盘问题(n行中放任意k行)

    n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列 Sample Input 2 1#.  //# 可放.#4 4...#..#..#..#...-1 -1Sample Output 21 # i ...

  3. HDU 3746 将字符串的全部字符最少循环2次需要添加的字符数

    Sample Input3aaaabcaabcde Sample Output025 题目大意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数.例子:abcabc 已经循环2次,添 ...

  4. 【BZOJ 3294】[Cqoi2011]放棋子

    题解: 一道很经典的组合数+dp 首先考虑f[i][j][k]表示前k种颜色正好占据了i行j列 转移的话就是枚举第k种颜色占据了几行几列 通过自身转移 然后其在内部的相对顺序是不确定的所以要乘以组合数 ...

  5. A. 【UNR #1】争夺圣杯

    题解: 一道比较水的题目 按照最一般的思路离散化后枚举最大值 然后考虑最大值的贡献 会发现需要分类讨论一下 发现对一段k的影响是等差数列 所以可以用线段树维护差分数组

  6. mysql_union操作符

    MySQL  UNION操作符 union操作符合并两个或多个 SELECT 语句的结果集. union:去重 union all:不去重 UNION 结果集中的列名总是等于 UNION 中第一个 S ...

  7. BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

  8. BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1607 题意概括 给出n个数,每一个数字<1000000,对于每一个数,让你求剩余的n-1个数 ...

  9. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  10. Redis数据结构之哈希

    这个部分依旧分为两个步骤,一个是redis客户端,一个是java的客户端 一:Redis客户端 1.get与set 2.删除 3.增加 4.是否存在 hexists myhash2 age 5.获取长 ...