C#-异常处理(十四)
概念
异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常
但并不是所有的错误都是异常
而处理这种错误,称为异常处理
异常处理实际是不断去发掘异常、修改异常,使程序更稳定
异常处理主要表现在四个方面:
程序开发前:尽可能的想到会发生的错误,标注怎么处理应对
程序开发中:尽量暴露程序的问题,解决这些可能的异常
系统发布后:尽可能的解决隐藏的或测试人员未测试到的程序问题
发生异常时:异常代码转化成了友好提示显示给用户
异常分类
编译错误
大小写混淆
数据类型与变量类型不符
使用未声明的变量
运行错误
数组下标越界
除数为零
其他运行错误
逻辑错误
超出数据类型的取值范围
语句体忘记加大括号
其他逻辑性错误
异常处理操作
C#中异常处理时建立在四个关键词之上:try、catch、finally 和 throw。
try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块
catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获
finally:用于执行给定的语句,不管异常是否被抛出都会执行
throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成
异常语句格式
1 try 2 3 { 4 5 // 引起异常的语句 6 7 } 8 9 catch( ExceptionName e ) 10 11 { 12 13 // 错误处理代码 14 15 } 16 17 finally 18 19 { 20 21 // 要执行的语句 22 23 }
示例
1 using System; 2 namespace DivisorIsZero 3 { 4 public class DivisorIsZero 5 { 6 private static void Main() 7 { 8 int div0 = 20; 9 int div1 = 0; 10 int div2 = 2; 11 int DivValue; 12 13 try 14 { 15 DivValue = div0 / div1; 16 System.Console.WriteLine("div0 / div1 = {0}", DivValue); 17 } 18 catch(DivideByZeroException e ) 19 { 20 System.Console.WriteLine("零不能作为除数!异常值为:\n{0}",e); 21 } 22 23 // catch(DivideByZeroException e)子句只能捕获特定的异常 24 // try内的程序代码可能还会产生其它的异常,这些异常只能由catch(Exception e)来捕获了 25 catch(Exception e ) 26 { 27 System.Console.WriteLine("并非\''零作为除数引发的异常\"!异常值为:\n{0}",e); 28 } 29 finally 30 { 31 System.Console.WriteLine("无论是否发生异常,我都会显示"); 32 System.Console.ReadKey(); 33 } 34 } 35 } 36 }
结果
C#中常见的异常类
C# 异常是使用类来表示的
C# 中的异常类主要是直接或间接地派生于 System.Exception 类System.ApplicationException 和System.SystemException 类是派生于 System.Exception 类的异常类
System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类
System.SystemException 类是所有预定义的系统异常的基类
由System.SystemException派生的异常类型:
System.AccessViolationException 在试图读写受保护内存时引发的异常
System.ArgumentException 在向方法提供的其中一个参数无效时引发的异常
System.Collections.Generic.KeyNotFoundException 指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常
System.IndexOutOfRangeException 访问数组时,因元素索引超出数组边界而引发的异常
System.InvalidCastException 因无效类型转换或显示转换引发的异常
System.InvalidOperationException 当方法调用对于对象的当前状态无效时引发的异常
System.InvalidProgramException 当程序包含无效Microsoft中间语言(MSIL)或元数据时引发的异常,这通常表示生成程序的编译器中有bug
System.IO.IOException 发生I/O错误时引发的异常
System.NotImplementedException 在无法实现请求的方法或操作时引发的异常
System.NullReferenceException 尝试对空对象引用进行操作时引发的异常
System.OutOfMemoryException 没有足够的内存继续执行程序时引发的异常
System.StackOverflowException 挂起的方法调用过多而导致执行堆栈溢出时引发的异常
由System.ArgumentException派生的异常类型:
System.ArgumentNullException 当将空引用传递给不接受它作为有效参数的方法时引发的异常
System.ArgumentOutOfRangeException 当参数值超出调用的方法所定义的允许取值范围时引发的异常
由System.ArithmeticException派生的异常类型:
System.DivideByZeroException 试图用零除整数值或十进制数值时引发的异常
System.NotFiniteNumberException 当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常
System.OverflowException 在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常
由System.IOException派生的异常类型:
System.IO.DirectoryNotFoundException 当找不到文件或目录的一部分时所引发的异常
System.IO.DriveNotFoundException 当尝试访问的驱动器或共享不可用时引发的异常
System.IO.EndOfStreamException 读操作试图超出流的末尾时引发的异常
System.IO.FileLoadException 当找到托管程序却不能加载它时引发的异常
System.IO.FileNotFoundException 试图访问磁盘上不存在的文件失败时引发的异常
System.IO.PathTooLongException 当路径名或文件名超过系统定义的最大长度时引发的异常
其他常用异常类型:
ArrayTypeMismatchException 试图在数组中存储错误类型的对象
BadImageFormatException 图形的格式错误
DivideByZeroException 除零异常
DllNotFoundException 找不到引用的dll
FormatException 参数格式错误
MethodAccessException 试图访问私有或者受保护的方法
MissingMemberException 访问一个无效版本的dll
NotSupportedException 调用的方法在类中没有实现
PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误