• 20、异常和状态管理


    namespace CLR_Via
    {
        class Class4
        {
            static void Main()
            {
                DiskFullException.TestException();
                Console.ReadKey();
            }
        }
        [Serializable]
        public sealed class DiskFullException : ExceptionArgs
        {
            private readonly string m_diskPath;
    
            public DiskFullException(string diskPath)
            {
                this.m_diskPath = diskPath;
            }
    
            public string DiskPath { get { return m_diskPath; } }
    
            public override string Message
            {
                get
                {
                    return m_diskPath == null ? base.Message : "DiskPath = " + m_diskPath;
                }
            }
    
            public static void TestException()
            {
                try
                {
                    throw new Exception<DiskFullException>(new DiskFullException(@"C:"), "this disk is full");
                }
                catch (Exception<DiskFullException> ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
            }
        }
        public sealed class Exception<TExceptionArgs> : Exception, ISerializable where TExceptionArgs : ExceptionArgs
        {
            private const string c_args = "Args";
            private readonly TExceptionArgs m_args;
    
            public TExceptionArgs Args { get { return m_args; } }
    
            public Exception(string message = null, Exception innerException = null) : this(null, message, innerException)
            {
    
            }
    
            public Exception(TExceptionArgs args, string message = null, Exception innerException = null) : base(message, innerException)
            {
                m_args = args;
            }
    
            [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
            private Exception(SerializationInfo info, StreamingContext context) : base(info, context)
            {
                m_args = (TExceptionArgs)info.GetValue(c_args, typeof(TExceptionArgs));
            }
    
            [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
            public override void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue(c_args, m_args);
                base.GetObjectData(info, context);
            }
    
            public override string Message
            {
                get
                {
                    string baseMsg = base.Message;
                    return (m_args == null) ? baseMsg : string.Format("{0} {1} ", baseMsg, m_args.Message);
                }
            }
    
            public override bool Equals(object obj)
            {
                Exception<TExceptionArgs> other = obj as Exception<TExceptionArgs>;
                if (other == null)
                    return false;
                return object.Equals(m_args, other.m_args) && base.Equals(obj);
            }
    
            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }
        [Serializable]
        public abstract class ExceptionArgs
        {
            public virtual string Message { get { return string.Empty; } }
        }
    }
    

      

  • 相关阅读:
    windows下python3.6环境搭建
    接口自动化(2)----如何编写接口自动化用例
    关于接口自动化测试的规则说明
    linux 常用命令 补充
    linux 常用命令
    linux 初识
    java高级教程 JDK代理和CGLIB代理两种方式 账户类
    java高级教程 实例化和非实例化 bean 学生信息
    java高级教程 俩数之和
    C++使用printf输出string类
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/9886502.html
Copyright © 2020-2023  润新知