HTML5技术

关于.NET异常处理的思考 - 彭泽0902(3)

字号+ 作者:H5之家 来源:H5之家 2016-12-23 10:02 我要评论( )

[__DynamicallyInvokable] Message{[__DynamicallyInvokable] get { if ( this ._message != null ){ return this ._message;} if ( this ._className == null ){ this ._className = this .GetClassName();} , new

[__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#》,这里就不做具体的介绍。

四.总结:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你 - sheng.chao

    升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你 - sheng.c

    2016-12-20 11:01

  • 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七) - 彭泽0902

    免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七

    2016-12-14 12:00

  • 【.net 深呼吸】细说CodeDom(2):表达式、语句 - 东邪独孤

    【.net 深呼吸】细说CodeDom(2):表达式、语句 - 东邪独孤

    2016-12-13 12:00

  • form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】和【前进】进行提交操作 - 怪诞咖啡

    form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】

    2016-12-10 11:00

网友点评
e