《C#入门到精通》学习笔记 -- 异常类

来源:互联网 发布:mobi域名 编辑:程序博客网 时间:2024/06/07 03:06

异常类主要非为7种:

(1)基类Exception
(2)常见的异常类
       1、SystemException类:该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)
       2、ApplicationException类:该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)
(3)与参数有关的异常类:此类异常类均派生于SystemException,用于处理给方法成员传递的参数时发生异常
       1、ArgumentException类:该类用于处理参数无效的异常,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称。
       2、FormatException类:该类用于处理参数格式错误的异常。
(4)与成员访问有关的异常
       1、MemberAccessException类:该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)
       2、MemberAccessException类的直接派生类:
             i、FileAccessException类:该类用于处理访问字段成员失败所引发的异常
             ii、MethodAccessException类:该类用于处理访问方法成员失败所引发的异常
             iii、MissingMemberException类:该类用于处理成员不存在时所引发的异常
(5)与数组有关的异常:以下三个类均继承于SystemException类
       1、IndexOutOfException类:该类用于处理下标超出了数组长度所引发的异常
       2、ArrayTypeMismatchException类:该类用于处理在数组中存储数据类型不正确的元素所引发的异常
       3、RankException类:该类用于处理维数错误所引发的异常
(6)与IO有关的异常
       1、IOException类:该类用于处理进行文件输入输出操作时所引发的异常。
       2、IOException类的5个直接派生类:
           i、DirectionNotFoundException类:该类用于处理没有找到指定的目录而引发的异常。
           ii、FileNotFoundException类:该类用于处理没有找到文件而引发的异常。
           iii、EndOfStreamException类:该类用于处理已经到达流的末尾而还要继续读数据而引发的异常。
           iv、FileLoadException类:该类用于处理无法加载文件而引发的异常。
           v、PathTooLongException类:该类用于处理由于文件名太长而引发的异常。
(7)与算术有关的异常
       1、ArithmeticException类:该类用于处理与算术有关的异常。
       2、ArithmeticException类的派生类:
           i、DivideByZeroException类:表示整数货十进制运算中试图除以零而引发的异常。
           ii、NotFiniteNumberException类:表示浮点数运算中出现无穷打或者非负值时所引发的异常。

(8)自定义异常

如要建立自定义的异常类 CustomException,它要继承自ApplicationException类(这是一个在发生非致命的应用程序错误时抛出的通用异常,它又继承于更为通用的Exception类),将其用作为应用程序定义的任何自定义异常的基类。通过这个基类,可以编写一个通用的catch代码块,捕获应用程序定义的任何自定义异常类型。构建一个简单的场景,使用Northwind数据库,向其中添加一条Customer记录,如果ID重复则抛出相应的异常信息。
       1. 定义自定义的基础异常类   

public class CustomException:ApplicationException       {           public CustomException()           {          }            public CustomException(string message, Exception inner):base(message,inner)          {           }       }  
定义两个处理异常的方法,使用base关键字让CustomException方法继承自基本的错误异常类ApplicationException并提供了两个参数,一个异常消息参数和一个异常错误类。

      2. 再定一个处理我们不同自定义错误类型的错误处理类,不同的应用程序异常类型使用不同的异常处理类。

public class DuplicateCustomerIDException : CustomException       {           public DuplicateCustomerIDException()           { }  public DuplicateCustomerIDException(string message, Exception inner):base(message,inner)           {  }       } 
        3. 最后在添加客户记录的时候,使用自定义的C#异常类

private void AddCustomerRecord()    {               SqlConnection cn = new SqlConnection(DBConn);               cn.Open();                try               {                   SqlCommand com = new SqlCommand("Insert Into Customers (CustomerID,CompanyName,ContactName) Values ('"+ftxt_CustomerID.Text+"','"+ftxt_CompanyName.Text+"','"+ftxt_ContactName.Text+"')",cn);       com.ExecuteNonQuery();               }               catch(SqlException ex)               {                   if(ex.Number == 2627)                   {                       throw new DuplicateCustomerIDException("CustomerID重复",ex);               }                   else                   {                       MessageBox.Show("成功","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);                   }               }               finally               {                   cn.Close();               }           }  
其中的ex.Number == 2627就是由于数据表中主键重复不能添加重复主键的记录时抛出的异常号码,如果异常类型符合怎抛出我们自定义的异常处理类

          4. 最后在调用这个方法时,编写代码捕获这个我们自定义类型的异常

private void fbtn_Submit_Click(object sender, System.EventArgs e)             {                 try                {                     AddCustomerRecord();                 }                 catch(DuplicateCustomerIDException ex)                {                     MessageBox.Show(ex.Message);        }             }