[__DynamicallyInvokable]
Message
{
[__DynamicallyInvokable]
get
{
if (this._message != null)
{
return this._message;
}
if (this._className == null)
{
this._className = this.GetClassName();
}
, new object[] { this._className });
}
}
由以上的代码可以看出,Message只具有get属性,所以message是只读属性。GetClassName()获取异常的类。GetRuntimeResourceString()获取运行时资源字符串。
2.StackTrace属性:包含抛出异常之前调用过的所有方法的名称和签名。
StackTrace
{
[SecuritySafeCritical]
get
{
new EnvironmentPermission(PermissionState.Unrestricted).Demand();
return GetStackTrace(null, true);
}
}
EnvironmentPermission()用于环境限制,PermissionState.Unrestricted设置权限状态,GetStackTrace()获取堆栈跟踪,具体看一下GetStackTrace()的代码。
GetStackTrace(Exception e, bool needFileInfo)
{
StackTrace trace;
if (e == null)
{
trace = new StackTrace(needFileInfo);
}
else
{
trace = new StackTrace(e, needFileInfo);
}
return trace.ToString(StackTrace.TraceFormat.Normal);
}
public StackTrace(Exception e, bool fNeedFileInfo) { if (e == null) { ); } this.m_iNumOfFrames = 0; this.m_iMethodsToSkip = 0; this.CaptureStackTrace(0, fNeedFileInfo, null, e); }
以上是获取堆栈跟踪方法的具体实现,此方法主要用户调试的时候。
3.GetBaseException()获取基础异常信息方法。[__DynamicallyInvokable] public virtual Exception GetBaseException() { Exception innerException = this.InnerException; Exception exception2 = this; while (innerException != null) { exception2 = innerException; innerException = innerException.InnerException; } return exception2; }
InnerException属性是内在异常,这是一个虚方法,在这里被重写。具体看一下InnerException属性。
[__DynamicallyInvokable] public Exception InnerException { [__DynamicallyInvokable, TargetedPatchingOptOut()] get { return this._innerException; } }
4.ToString()将异常信息格式化。
private string ToString(bool needFileLineInfo, bool needMessage)
{
string className;
string str = needMessage ? this.Message : null;
if ((str == null) || (str.Length <= 0))
{
className = this.GetClassName();
}
else
{
className = + str;
}
if (this._innerException != null)
{
className = className + + );
}
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
{
className = className + Environment.NewLine + stackTrace;
}
return className;
}
在此方法中,将获取的异常信息进行格式化为字符串,this.GetClassName() 获取异常类的相关信息。
以上我们注意到[__DynamicallyInvokable]定制属性,我们看一下具体的实现代码:
[TargetedPatchingOptOut()]
public __DynamicallyInvokableAttribute()
{
}
以上我们主要注释部分,”图像边界“这个属性的相关信息,请参见《Via CLR c#》,这里就不做具体的介绍。
四.总结: