【转】C#自定义异常类简介

文章来源:http://www.csharpwin.com/csharpspace/7788r1541.shtml

摘要:本文解决了C#异常类的自定义问题。我们可以捕获一个通用的异常,识别它和应用程序的关系,然后把它作为特定于应用程序的异常再次抛出,以便能适当地处理它。

首先我们建立自己的C#异常类 CustomException,它要继承自ApplicationException类(这是一个在发生非致命的应用程序错误时抛出的通用异常,它又继承于更为通用的Exception类),将其用作为应用程序定义的任何自定义异常的基类。通过这个基类,我们就可以编写一个通用的catch代码块,捕获应用程序定义的任何自定义异常类型。

    自定义的异常类型可以在这中间扮演一个非常重要的角色。我们可以捕获一个通用的异常,识别它和应用程序的关系,然后把它作为特定于应用程序的异常再次抛出,以便能适当地处理它。

    这里构建了一个简单的场景,使用Northwind数据库,向其中添加一条Customer记录,如果ID重复则抛出相应的异常信息。

    (1) 定义我们的基础异常类   

  1. public class CustomException:ApplicationException       
  2. {        
  3.    public CustomException()      
  4.      {      
  5.     }      
  6.       public CustomException(string message, Exception inner)
  7. :base(message,inner)     
  8.      {    
  9.  
  10.       }   
  11.     }  

    定义两个处理异常的方法,使用base关键字让CustomException方法继承自基本的错误异常类ApplicationException并提供了两个参数,一个异常消息参数和一个异常错误类。

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

 

  1. public class DuplicateCustomerIDException : CustomException      
  2.  {         
  3.   public DuplicateCustomerIDException()          
  4.  {          
  5.  
  6. }          
  7.  
  8. public DuplicateCustomerIDException(string message, Exception inner):
  9. base(message,inner)          
  10.  {         
  11.  
  12.  }      
  13.  }  

    当出现相应类型的异常时,在这个自定义异常处理中可以在出现错误的时候做一系列的处理,然后再抛出异常信息,例如:记录错误日志,或者做容错处理等。

    (3) 最后我们在添加客户记录的时候,使用我们自定义的C#异常类        

  1. private void AddCustomerRecord()          
  2.  {               
  3. SqlConnection cn = new SqlConnection(DBConn);               
  4. cn.Open();               
  5.  try               
  6. {                   
  7. SqlCommand com = new SqlCommand(
  8. "Insert Into Customers (CustomerID,CompanyName,ContactName) Values ('"
  9. +ftxt_CustomerID.Text+"','"+ftxt_CompanyName.Text+"','"
  10. +ftxt_ContactName.Text+"')",cn);                  
  11.  
  12. com.ExecuteNonQuery();               
  13. }              
  14.  catch(SqlException ex)               
  15. {                  
  16.  if(ex.Number == 2627)                   
  17. {                      
  18.  throw new DuplicateCustomerIDException("CustomerID重复",ex);                   
  19. }                   
  20. else                  
  21.  {                       
  22. MessageBox.Show(
  23. "成功","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information,
  24. MessageBoxDefaultButton.Button1,
  25. MessageBoxOptions.DefaultDesktopOnly);                  
  26.  }              
  27.  }              
  28.  finally              
  29.  {                   
  30. cn.Close();               
  31. }          
  32.  }  

    其中的ex.Number == 2627就是由于数据表中主键重复不能添加重复主键的记录时抛出的异常号码,如果异常类型符合怎抛出我们自定义的异常处理类。

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

  1. private void fbtn_Submit_Click(object sender, System.EventArgs e)             
  2. {                 
  3. try                
  4. {                   
  5.   AddCustomerRecord();                
  6.  }                 
  7. catch(DuplicateCustomerIDException ex)              
  8.   {                     
  9. MessageBox.Show(ex.Message);                 
  10. }             
  11. }   

    以上就实现了C#异常类的自定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值