CLR Via C#笔记:自定义异常

派生自Exception的异常类型都应该可以序列化,因为只有这样异常对象才能在跨应用程序域时得到封送处理。

 

[Serializable]
    
public   sealed   class  DiskFullException : Exception, ISerializable
    {
        
private   string  m_diskpath;
        
public   string  DiskPath {  get  {  return  m_diskpath; } }

        
public   override   string  Message
        {
            
get
            {
                
if  (m_diskpath  ==   null return   base .Message;
                StringBuilder msg 
=   new  StringBuilder( base .Message);
                msg.AppendFormat(
"  (DiskPath={0}) {1} " , m_diskpath, Environment.NewLine);
                
return  msg.ToString();
            }
        }


        
public  DiskFullException() :  base () { }
        
public  DiskFullException( string  message) :  base (message) { }
        
public  DiskFullException( string  message, Exception innerException)
            : 
base (message, innerException)
        { }

        
public  DiskFullException( string  message,  string  diskpath)
            : 
this (message)
        {
            m_diskpath 
=  diskpath;
        }
        
public  DiskFullException( string  message,  string  diskpath, Exception innerException)
            : 
this (message, innerException)
        {
            m_diskpath 
=  diskpath;
        }

        
// 定义一个反序列化的构造器,因为类是密封的,所以该构造器是私有的;
        
// 否则,该构造器可以是受保护的
         private  DiskFullException(SerializationInfo info, StreamingContext context)
            : 
base (info, context)
        {
            
// 反序列化自定义字段
            m_diskpath  =  info.GetString( " DiskPath " );
        }

        
#region  ISerializable 成员
        
// 确保调用者获得对象的内部状态
        [SecurityPermission(SecurityAction.Demand, SerializationFormatter =   true )]
        
void  ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            
base .GetObjectData(info, context);
            
// 序列化自定义字段
            info.AddValue( " DiskPath " , m_diskpath);
        }
        
#endregion
    }

 

 

你可能感兴趣的:(自定义异常)