.NET异常处理最佳实践方案
关于.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]标识
多数情况下需要异常是可序列化的。当从另一个异常类继承的时候,不要忘记增添这一属性。