来源:http://blog.youkuaiyun.com/byxdaz/article/details/6737636
一、概念
异常是程序执行时遇到的任何错误情况或意外行为。以下这些情况都可以引发异常:您的代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运行库遇到意外情况(如无法验证代码),等等。对于这些情况,应用程序可以从其中一些恢复,而对于另一些,则不能恢复。尽管可以从大多数应用程序异常中恢复,但不能从大多数运行库异常中恢复。由于ASP.NET是在网络环境中运行的,安全成为需要首先考虑的重要因素之一。为了能够及时有效地处理程序中的运行错误,引入了异常和异常类。作为面向对象的语言,异常与其他语言要素一样,是面向对象规范的一部分,是异常类的对象。
异常类和属性
Exception 类是异常从其进行继承的基类。大多数异常对象都是 Exception 的某个派生类的实例,不过,任何从 Object 类派生的对象都可以作为异常引发。
Exception 类的若干属性使了解异常更容易。这些属性包括:
1、StackTrace属性。
此属性包含可用来确定错误发生位置的堆栈跟踪。如果有可用的调试信息,则堆栈跟踪包含源文件名和程序行号。
2、InnerException属性。
此属性可用来在异常处理过程中创建和保留一系列异常。可使用此属性创建一个新异常来包含以前捕捉的异常。原始异常可由 InnerException 属性中的第二个异常捕获,这使处理第二个异常的代码可以检查附加信息。
例如,假设有一个读取文件并格式化相应数据的方法。代码试图从文件读取,但引发 FileException。该方法捕捉 FileException 并引发BadFormatException。在此情况下,FileException 可保存在BadFormatException 的 InnerException 属性中。
为提高调用方确定异常引发原因的能力,有时可能需要方法捕捉帮助器例程引发的异常,然后引发一个进一步指示已发生的错误的异常。可以创建一个更有意义的新异常,其中内部异常引用可以设置为原始异常。然后可以针对调用方引发这种更有意义的异常。请注意,使用此功能,可以创建以最先引发的异常作为结束点的一系列相链接的异常。
3、Message属性。
此属性提供有关异常起因的详细信息。Message 用引发异常的线程的Thread.CurrentUICulture 属性所指定的语言表示。
4、HelpLink属性。
此属性可保存某个帮助文件的 URL(或 URN),该文件提供有关异常起因的大量信息。
5、Data属性
此属性是可以保存任意数据(以键值对的形式)的 IDictionary。
大多数从 Exception 继承的类都不实现其他成员或提供附加功能;它们只是从 Exception 继承。因此,在异常层次结构、异常名称以及异常包含的信息中可以找到有关异常的最重要信息。
c#异常处理所用到的几个关键字:
1、try用于检查发生的异常,并帮助发送任何可能的异常。
2、catch以控制权更大的方式处理错误,可以有多个catch子句。 正确排列捕获异常的catch子句,范围小的Exception放在前面的catch。即如果Exception之间存在继承关系,就应把子类的Exception放在前面的catch子句中。
3、finally无论是否引发了异常,finally的代码块都将被执行。
4、throw用于引发异常,可引发预定义异常和自定义异常。 实际上,它常用于可能要求的清理代码。
try
{
程序代码块;
}
catch(Exceptione)
{
异常处理代码块;
}
finally
{
无论是否发生异常,均要执行的代码块;
}
二、常见C#异常类
C#异常类一、基类Exception
C#异常类二、常见的异常类
1、SystemException类:该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)
2、ApplicationException类:该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)
C#异常类三、与参数有关的异常类
此类异常类均派生于SystemException,用于处理给方法成员传递的参数时发生异常
1、ArgumentException类:该类用于处理参数无效的异常,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称。
2、FormatException类:该类用于处理参数格式错误的异常。
C#异常类四、与成员访问有关的异常
1、MemberAccessException类:该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)
2、MemberAccessException类的直接派生类:
i、FileAccessException类:该类用于处理访问字段成员失败所引发的异常
ii、MethodAccessException类:该类用于处理访问方法成员失败所引发的异常
iii、MissingMemberException类:该类用于处理成员不存在时所引发的异常
C#异常类五、与数组有关的异常
以下三个类均继承于SystemException类
1、IndexOutOfException类:该类用于处理下标超出了数组长度所引发的异常
2、ArrayTypeMismatchException类:该类用于处理在数组中存储数据类型不正确的元素所引发的异常
3、RankException类:该类用于处理维数错误所引发的异常
C#异常类六、与IO有关的异常
1、IOException类:该类用于处理进行文件输入输出操作时所引发的异常。
2、IOException类的5个直接派生类:
i、DirectionNotFoundException类:该类用于处理没有找到指定的目录而引发的异常。
ii、FileNotFoundException类:该类用于处理没有找到文件而引发的异常。
iii、EndOfStreamException类:该类用于处理已经到达流的末尾而还要继续读数据而引发的异常。
iv、FileLoadException类:该类用于处理无法加载文件而引发的异常。
v、PathTooLongException类:该类用于处理由于文件名太长而引发的异常。
C#异常类七、与算术有关的异常
1、ArithmeticException类:该类用于处理与算术有关的异常。
2、ArithmeticException类的派生类:
i、DivideByZeroException类:表示整数货十进制运算中试图除以零而引发的异常。
ii、NotFiniteNumberException类:表示浮点数运算中出现无穷大或者非负值时所引发的异常。
在.NET框架中的异常类都派生自SystemException 类。这个类的大部分常用成员如下:
HelpLink是一个链接到帮助文件的链接,该帮助文件提供异常的相关信息。
Message是指明一个错误细节的文本。
Source导致异常的对象或应用的名称。
StackTrace是堆栈中调用的方法列表。
TargetSite是抛出异常的方法名称。
三、注意问题
try
{
...
}
catch(exception e)
{
throw;//向上层原样抛出
throw new XXException(...);//抛出其他异常
}
让线程从catch快的底部退出其实就是忽略这个错误
try
{
}
catch
{
;//什么都不做 或者用于捕获其他语言模块代码异常(比如C++)
}
异常一层层向外抛,外层只知道异常,不知道哪里出异常,出异常,程序都是运行catch块里的内容,catch块里不处理,那么就运行catch块下面的代码。异常不处理的情况多了,比如网络错误,只需要记录日志就可以。