.NET异常处理最佳实践方案

jopen 11年前

       关于.NET的异常处理,其实和JAVA是非常类似的,都是有了GC(垃圾回收器)。而在早期的VB/C/C++中貌似是没有垃圾回收这个说法的,关于GC的各个好处大家都心知肚明了。那么,我们各位“猿”应该如何利用GC,更高效的编程呢?

        说实话,这部分内容不太好整理,也不太好说明白。这些天反复整理这些内容,总觉得没有抓住重点,花了非常大的功夫。后来想想,了解他的机制,倒不如多学学如何更好的利用它。

        在此之前,先说一些基本的概念。

        错误:程序中的错误一般分为三类:语法错误、逻辑错误、运行时错误。在异常处理中,错误主要说的是运行时错误,即已编译好的程序在执行过程中出现的问题。

        异常:由于错误的出现,运行时创建的用于处理错误的对象。

        这里要强调的是:错误是指一个事件,而异常则是为了处理这个事件而创建的对象。

 

        这里给出一些好的实践方案,或者也可是说是异常处理原则。

        1、及早检查。

                发现问题越早,这个问题就越容易解决
        2、不要相信外部数据

                所有的外部数据都应该被检查(数据库、文件、键盘等)
        3、尽量不要抛出new Exception()

                Exception是一个非常大的类,包含的信息量大
                尽量使抛出的异常有针对性,能提供有意义的错误信息。
        4、记录异常

                如果你捕获一个异常,一定要在某处加以记录,不要只记录.message中的信息,要记录所有的错误信息。
        5、不要吞掉异常

                你做的最糟糕的事情是在catch (Exception)后加了一个空的模块。
        6、经常使用Using

                即使在有异常出现的地方,关键字using也会阻止资源泄漏。例如

            using(SqlConnection conn = new SqlConnection())                {                    //do something;                }  
    7、不要把异常处理方法作为从函数中返回信息的手段(不要用异常控制流程)

                不仅异常的处理缓慢,而且代码中许多的try/catch模块会导致代码很难维护。
        8、为那些不该被忽略的错误使用异常

                如果方法的执行有一定的要求或者前提,则应该使用异常,这样调用程序就不能忽略它(例如,某些方法需要用户信息)
        9、当再次抛出异常时不要清空堆栈追踪

 

                 Try  {

                        }
                 catch(Exception ex)
                 {

                     //错误的方式

                      throw ex;

                 }

                Try{

                      }
                catch(Exception ex)
                 {

                      //正确的方式

                     throw ;

                 }

       这里都是说捕获到异常之后再次抛出,之所以说第一种情况是错误,是因为,第一种情况下,抛出的是新的异常,原来的异常信息被覆盖掉了。而第二种情况会保留捕获到的异常信息,在原来错误的基础之上增加新的错误信息以抛出。

        10、异常应该用[Serializable]标识

                多数情况下需要异常是可序列化的。当从另一个异常类继承的时候,不要忘记增添这一属性。