HTML5技术

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

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

年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的看着大佬们发表心情。 以上的废话说的够多了,这里

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的看着大佬们发表心情。

    以上的废话说的够多了,这里就不再废话了,还是切入正题吧。

    在项目开发中,对于系统和代码的稳定性和容错性都是有对应的要求。实际开发项目中的代码与样例代码的区别,更多的是在代码的运行的稳定性、容错性、扩展性的比较。因为对于实现一个功能来说,实现功能的核心代码是一样的,可能只是在写法上优化而已,但是在实现某一个操作上使用的类来说,这一点是绝大多数时候是一样的。这样看来,我们在实际开发的过程中,需要考虑的问题比较多,已经不仅仅局限于某一具体的功能实现,更多的是代码的稳定性和扩展性考虑。

    以上是在实际开发中需要面对的问题,笔者在最近的博文中,也在考虑这个异常到底需要怎么去写,以及异常到底需要怎么去理解,在博文中,也有不少的园友对异常的写法和处理提出了自己的意见,在这里我就写一下自己的一些理解,可能写的比较浅显和粗略,但是只当是一个引子,可以引出大佬们来谈谈自己的实际项目经验。希望对大家有一个帮助,也欢迎大家提出自己的想法和意见,分享自己的知识和见解。

一.DotNET异常的概述:

    谈到异常,我们就需要知道什么叫做异常,万事万物如果我们想去学习,就应该知道我们要学习的东西是什么,这样在心里也好有一个大概的认知。异常是指成员没有完成它的名称宣称可以完成的行动。在.NET中,构造器、获取和设置属性、添加和删除事件、调用操作符重载和调用转换操作符等等都没有办法返回错误代码,但是在这些构造中又需要报告错误,那就必须提供异常处理机制。

    在异常的处理中,我们经常使用到的三个块分别是:try块;catch块;finally块。这三个块可以一起使用,也可以不写catch块使用,异常处理块可以嵌套使用,具体的方法在下面会介绍到。

    在异常的处理机制中,一般有三种选择:重新抛出相同的异常,向调用栈高一层的代码通知该异常的发生;抛出一个不同的异常,想调用栈高一层代码提供更丰富的异常信息;让线程从catch块的底部退出。   

   有关异常的处理方式,有一些指导性的建议。

       1.恰当的使用finally块:

           finally块可以保证不管线程抛出什么类型的异常都可以被执行,finall块一般用来做清理那些已经成功启动的操作,然后再返回调用者或者finally块之后的代码。

       2.异常捕捉需适当:

           为什么要适当的捕捉异常呢?如下代码,因为我们不能什么异常都去捕捉,在捕获异常后,我们需要去处理这些异常,如果我们将所有的异常都捕捉后,但是没有预见会发生的异常,我们就没有办法去处理这些异常。

         如果应用程序代码抛出一个异常,应用程序的另一端则可能预期要捕捉这个异常,因此不能写成一个”大小通吃“的异常块,应该允许该异常在调用栈中向上移动,让应用程序代码针对性地处理这个异常。

         在catch块中,可以使用System.Exception捕捉异常,但是最好在catch块末尾重新抛出异常。至于原因在后面会讲解到。

try { var hkml = GetRegistryKey(rootKey); var subkey = hkml.CreateSubKey(subKey); if (subkey != null && keyName != string.Empty) subkey.SetValue(keyName, keyValue, RegistryValueKind.String); } catch (Exception ex) { Log4Helper.Error(+ ex); throw new Exception(ex.Message,ex); }

       3.从异常中恢复:

           我们在捕获异常后,可以针对性的写一些异常恢复的代码,可以让程序继续运行。在捕获异常时,需要捕获具体的异常,充分的掌握在什么情况下会抛出异常,并知道从捕获的异常类型派生出了那些类型。除非在catch块的末尾重新抛出异常,否则不要处理或捕获System.Exception异常。

      4.维持状态:

          一般情况下,我们完成一个操作或者一个方法时,需要调用几个方法组合完成,在执行的过程中会出现前面几个方法完成,后面的方法发生异常。发生不可恢复的异常时回滚部分完成的操作,因为我们需要恢复信息,所有我们在捕获异常时,需要捕获所有的异常信息。

      5.隐藏实现细节来维持契约:

          有时可能需要捕捉一个异常并重新抛出一个不同的异常,这样可以维系方法的契约,抛出的心异常类型地应该是一个具体的异常。看如下代码:

FileStream fs = null; try { fs = FileStream(); } catch (FileNotFoundException e) {
          //抛出一个不同的异常,将异常信息包含在其中,并将原来的异常设置为内部异常
throw new NameNotFoundException(); } catch (IOException e) {

//抛出一个不同的异常,将异常信息包含在其中,并将原来的异常设置为内部异常 (fs != null)
{
fs.close();
}
}

     以上的代码只是在说明一种处理方式。应该让抛出的所有异常都沿着方法的调用栈向上传递,而不是把他们”吞噬“了之后抛出一个新的异常。如果一个类型构造器抛出一个异常,而且该异常未在类型构造器方法中捕获,CLR就会在内部捕获该异常,并改为抛出一个新的TypeInitialztionException。

二.DotNET异常的常用处理机制:

 

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

网友点评
)