HTML5技术

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

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

在代码发生异常后,我们需要去处理这个异常,如果一个异常没有得到及时的处理,CLR会终止进程。在异常的处理中,我们可以在一个线程捕获异常,在另一个线程中重新抛出异常。异常抛出时,CLR会在调用栈中向上查找与

      在代码发生异常后,我们需要去处理这个异常,如果一个异常没有得到及时的处理,CLR会终止进程。在异常的处理中,我们可以在一个线程捕获异常,在另一个线程中重新抛出异常。异常抛出时,CLR会在调用栈中向上查找与抛出的异常类型匹配的catch块。如果没有任何catch块匹配抛出的异常类型,就发生一个未处理异常。CLR检测到进程中的任何线程有一个位处理异常,都会终止进程。

     1.异常处理块:

       (1).try块:包含代码通常需要执行一些通用的资源清理操作,或者需要从异常中恢复,或者两者都需要。try块还可以包含也许会抛出异常的代码。一个try块至少有一个关联的catch块或finall块。       

       (2).catch块:包含的是响应一个异常需要执行的代码。catch关键字后的圆括号中的表达式是捕获类型。捕获类型从System.Exception或者其派生类指定。CLR自上而下搜素一个匹配的catch块,所以应该教具体的异常放在顶部。一旦CLR找到一个具有匹配捕获类型的catch块,就会执行内层所有finally块中的代码,”内层finally“是指抛出异常的tey块开始,到匹配异常的catch块之间的所有finally块。

       使用System.Exception捕捉异常后,可以采用在catch块的末尾重新抛出异常,因为如果我们在捕获Exception异常后,没有及时的处理或者终止程序,这一异常可能对程序造成很大的安全隐患,Exception类是所有异常的基类,可以捕获程序中所有的异常,如果出现较大的异常,我们没有及时的处理,造成的问题是巨大的。

       (3).finally块:包含的代码是保证会执行的代码。finally块的所有代码执行完毕后,线程退出finally块,执行紧跟在finally块之后的语句。如果不存在finally块,线程将从最后一个catch块之后的语句开始执行。

      备注:异常块可以组合和嵌套,对于三个异常块的样例,在这里就不做介绍,异常的嵌套可以防止在处理异常的时候再次出现未处理的异常,以上这些就不再赘述。

    2.异常处理实例:        (1).异常处理扩展方法:

格式化异常消息 FormatMessage(this Exception e, bool isHideStackTrace = false) { var sb = new StringBuilder(); var count = 0; var appString = string.Empty; while (e != null) { if (count > 0) { appString += " "; } sb.AppendLine(, appString, e.Message)); sb.AppendLine(, appString, e.GetType().FullName)); sb.AppendLine(, appString, (e.TargetSite == null ? null : e.TargetSite.Name))); sb.AppendLine(, appString, e.Source)); if (!isHideStackTrace && e.StackTrace != null) { sb.AppendLine(, appString, e.StackTrace)); } if (e.InnerException != null) { sb.AppendLine(, appString)); count++; } e = e.InnerException; } return sb.ToString(); }

     (2).验证异常:

检查字符串是空的或空的,并抛出一个异常 CheckNullOrEmpty(string val, string paramName) { if (string.IsNullOrEmpty(val)) ); } 请检查参数不是空的或空的,并抛出异常 CheckNullParam(string param, string paramName) { if (string.IsNullOrEmpty(param)) ); } 检查参数不是无效,并抛出一个异常 CheckNullParam(object param, string paramName) { if (param == null) ); } 请检查参数1不同于参数2 CheckDifferentsParams(object param1, string param1Name, object param2, string param2Name) { if (param1 == param2) { + param2Name, param1Name + + param2Name); } } 检查一个整数值是正的(0或更大) PositiveValue(int val) { if (val < 0) ); }

     (3).Try-Catch扩展操作:

对某对象执行指定功能与后续功能,并处理异常情况 TryCatch<T>(this T source, Action<T> action, Action<Exception> failureAction, Action<T> successAction) where T : class { bool result; try { action(source); successAction(source); result = true; } catch (Exception obj) { failureAction(obj); result = false; } return result; } 对某对象执行指定功能,并处理异常情况 TryCatch<T>(this T source, Action<T> action, Action<Exception> failureAction) where T : class { return source.TryCatch(action, failureAction, obj => { }); } 对某对象执行指定功能,并处理异常情况与返回值 TResult TryCatch<T, TResult>(this T source, Func<T, TResult> func, Action<Exception> failureAction, Action<T> successAction) where T : class { TResult result; try { var u = func(source); successAction(source); result = u; } catch (Exception obj) { failureAction(obj); result = default(TResult); } return result; } 对某对象执行指定功能,并处理异常情况与返回值 TResult TryCatch<T, TResult>(this T source, Func<T, TResult> func, Action<Exception> failureAction) where T : class { return source.TryCatch(func, failureAction, obj => { }); }

     本文没有具体介绍try,catch,finally的使用,而是给出一些比较通用的方法,主要是一般的开发者对于三个块的使用都有一个认识,就不再做重复的介绍。

三.DotNET的Exception类分析:

        CLR允许异常抛出任何类型的实例,这里我们介绍一个System.Exception类:

      1.Message属性:指出抛出异常的原因。

 

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