• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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属性进行查看内部异常。
    您可能感兴趣的文章:
    • 如何用C#创建用户自定义异常浅析
    上一篇:C#反射实例学习及注意内容
    下一篇:WeakReference(弱引用)让GC需要时回收对象
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    C# 自定义异常总结及严格遵循几个原则 自定义,异常,总结,及,严格,