SoftException.cs
4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace HslCommunication.BasicFramework
{
/****************************************************************************
*
* 创建日期: 2017年6月25日 15:45:40
* 功能: 一个基础的泛型异常类
* 参考: 参考《CLR Via C#》P413
*
***************************************************************************/
/// <summary>
/// 一个自定义的支持序列化反序列化的异常类,具体用法参照第四版《CLR Via C#》P414
/// </summary>
/// <typeparam name="TExceptionArgs">泛型异常</typeparam>
[Serializable]
public sealed class Exception<TExceptionArgs> : Exception, ISerializable where TExceptionArgs : ExceptionArgs
{
/// <summary>
/// 用于反序列化的
/// </summary>
private const string c_args = "Args";
private readonly TExceptionArgs m_args;
/// <summary>
/// 消息
/// </summary>
public TExceptionArgs Args { get { return m_args; } }
/// <summary>
/// 实例化一个异常对象
/// </summary>
/// <param name="message">消息</param>
/// <param name="innerException">内部异常类</param>
public Exception(string message = null, Exception innerException = null) : this(null, message, innerException)
{
}
/// <summary>
/// 实例化一个异常对象
/// </summary>
/// <param name="args">异常消息</param>
/// <param name="message">消息</param>
/// <param name="innerException">内部异常类</param>
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));
}
/******************************************************************************************************
*
* 这个方法用于序列化,由于ISerializable接口的存在,这个方法必须是公开的
*
******************************************************************************************************/
/// <summary>
/// 获取存储对象的序列化数据
/// </summary>
/// <param name="info">序列化的信息</param>
/// <param name="context">流的上下文</param>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(c_args, m_args);
base.GetObjectData(info, context);
}
/// <summary>
/// 获取描述当前异常的消息
/// </summary>
public override string Message
{
get
{
string baseMsg = base.Message;
return m_args == null ? baseMsg : baseMsg + " (" + m_args.Message + ")";
}
}
/// <summary>
/// 确定指定的object是否等于当前的object
/// </summary>
/// <param name="obj">异常对象</param>
/// <returns>是否一致</returns>
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);
}
/// <summary>
/// 用作特定类型的哈希函数
/// </summary>
/// <returns>int值</returns>
public override int GetHashCode()
{
return base.GetHashCode();
}
}
/// <summary>
/// 异常消息基类
/// </summary>
[Serializable]
public abstract class ExceptionArgs
{
/// <summary>
/// 获取消息文本
/// </summary>
public virtual string Message
{
get { return string.Empty; }
}
}
}