C# 自定義異常的方法代碼演示及說明

mb78 9年前發布 | 3K 次閱讀 C#

在C#中所有的異常類型都繼承自System.Exception,也就是說,System.Exception是所有異常類的基類. 總起來說,其派生類分為兩種: 
1. SystemException類: 所有的CLR提供的異常類型都是由SystemException派生。 
2. ApplicationException類: 由用戶程序引發,用于派生自定義的異常類型,一般不直接進行實例化。 

創建自定義異常類應嚴格遵循幾個原則 
1. 聲明可序列化(用于進行系列化,當然如果你不需要序列化。那么可以不聲明為可序列化的) 
2. 添加一個默認的構造函數 
3. 添加包含message的構造函數 
4. 添加一個包含message,及內部異常類型參數的構造函數 
5. 添加一個序列化信息相關參數的構造函數.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication3
{
[Serializable] //聲明為可序列化的 因為要寫入文件中
public class PayOverflowException : ApplicationException//由用戶程序引發,用于派生自定義的異常類型
{
/// <summary>
/// 默認構造函數
/// </summary>
    public PayOverflowException() { }
    public PayOverflowException(string message)
        : base(message) { }
    public PayOverflowException(string message, Exception inner)
        : base(message, inner) { }
//public PayOverflowException(System.Runtime.Serialization.SerializationInfo info,
// System.Runtime.Serialization.StreamingContext context)
// : base(info, context) { }
}
internal class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
/// <summary>
/// current pay
/// </summary>
    public int CurrPay { get; set; }
    public Employee() { }
    public Employee(int id, string name, int currpay)
    {
        this.ID = id;
        this.Name = name;
        this.CurrPay = currpay;
    }
/// <summary>
/// 定義一個GiveBunus的虛方法以供不同的派生類進行重載
/// </summary>
/// <param name="amount">獎金額度</param>
    public virtual void GiveBunus(int amount)
    {
//用一個臨時變量記錄遞增之前的值
        var pay = CurrPay;
        this.CurrPay += amount;
        if (CurrPay > 10000)
        {
//發生異常,將CurrPay的值進行恢復,
//并拋出異常,外部程序捕獲次異常
            this.CurrPay = pay;
            var ex = new PayOverflowException("The employee's max pay should be no more than 10000.");
            throw ex;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("**** 創建Employee對象,并用try/catch捕獲異常 *****");
        var emp = new Employee(10001, "Yilly", 8000);
        try
        {
            emp.GiveBunus(3000);
        }
        catch (PayOverflowException ex)
        {
            Console.WriteLine("異常信息:{0}\n發生于{1}類的{2}方法", ex.Message,
                              ex.TargetSite.DeclaringType, ex.TargetSite.Name);
            try
            {
                var file = new FileStream(@"c:\customerexception.txt", FileMode.Create);
//*** 異常信息寫入文件中的代碼省略...
//以序列化方式寫入
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(file, ex);
                file.Close();
//以字節方式寫入
//byte[] buffer = System.Text.Encoding.Default.GetBytes(ex.Message);
//int leng = 0;
//leng = buffer.GetLength(0);
//file.Write(buffer, 0, leng);
//file.Close();
            }
            catch (Exception ex1)
            {
                var inner = new PayOverflowException(ex.Message, ex1);
                throw inner;
            }
        }
    }
}
}

值得注意的是:在實例化的時候調用的是PayOverflowException(string message, Exception inner)構造函數, 
如果本程序如果有其他程序在調用的時候, 可以通過.InnerExcetpion的Message屬性進行查看內部異常。

 本文由用戶 mb78 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!