首先我们建立自己的异常类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) 最后我们在添加客户记录的时候,使用我们自定义的异常
        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);
            }
        }