本文没有具体介绍try,catch,finally的使用,而是给出一些比较通用的方法,主要是一般的开发者对于三个块的使用都有一个认识,就不再做重复的介绍。
三.DotNET的Exception类分析:
CLR允许异常抛出任何类型的实例,这里我们介绍一个System.Exception类:
1.Message属性:指出抛出异常的原因。
[__DynamicallyInvokable]
public virtual string Message
{
[__DynamicallyInvokable]
get
{
if (this._message != null)
{
return this._message;
}
if (this._className == null)
{
this._className = this.GetClassName();
}
return Environment.GetRuntimeResourceString("Exception_WasThrown", new object[] { this._className });
}
}
由以上的代码可以看出,Message只具有get属性,所以message是只读属性。GetClassName()获取异常的类。GetRuntimeResourceString()获取运行时资源字符串。
2.StackTrace属性:包含抛出异常之前调用过的所有方法的名称和签名。
public static string StackTrace
{
[SecuritySafeCritical]
get
{
new EnvironmentPermission(PermissionState.Unrestricted).Demand();
return GetStackTrace(null, true);
}
}
EnvironmentPermission()用于环境限制,PermissionState.Unrestricted设置权限状态,GetStackTrace()获取堆栈跟踪,具体看一下GetStackTrace()的代码。
internal static string 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)
{
throw new ArgumentNullException("e");
}
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("Performance critical to inline this type of method across NGen image boundaries")]
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 = this.GetClassName() + ": " + str;
}
if (this._innerException != null)
{
className = className + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
}
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
{
className = className + Environment.NewLine + stackTrace;
}
return className;
}








