zoukankan      html  css  js  c++  java
  • 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; } }
        }
    }
    

      

  • 相关阅读:
    Disruptor详细介绍之快速入门
    Java魔法类:sun.misc.Unsafe
    Java开源框架推荐
    CAS(Compare and Swap)无锁算法之volatile不能保证原子性而Atomic可以
    数据库乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解
    Linux上查找线程使用的CPU时间最长
    虚拟机内存结构
    插入排序和归并排序(算法学习1)
    POJ-2942:吃糖果
    POJ-4004:数字组合(用位移方法解组合数问题,Java版)
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/9886502.html
Copyright © 2011-2022 走看看