.Net程序中Exception的处理实践经验

作为很自信的程序员,很多人都说自己设计的程序没有异常(Bug),我想能做到这点很难,有时候异常可能来自软件使用者错误的输入,比如:用户的非法输入,外部环境的影响,如网络中断等等,无法避免地给我们的程序来异常,通过我们的分析和设计,完全可以try_catch它, 然后准确地,友好地描述异常.

在.Net程序开发中,我觉得异常从不同的角度可以分很多的种类,这里我简单的分2类:
1).net framework里面定义的Exception以及子类SystemException,FormatException,KeyNotFoundException等等
2)我们自定义的Exception,在很多时候我们需要从业务上来判断数据,这一些数据对程序本身来说,并没有异常,但是从业务逻辑上来说,是错误的,也不是预期的结果,这时候我们就可以定义自己的异常.
一个简单的例子,用户取钱数目大于银行存款的时候,我们可以设计一个简单地异常,throw给interface,然后再友好地显示给用户.

面对种种异常,我们怎么处理呢,根据我的经验,做了一些简单的总结:
1,尽早的检查
   强类型检查以及验证可以阻止非预期的异常.


2,别相信外部的输入数据
   外部数据的数据是不可靠的,所以我们在处理这一些数据前一定要检查数据的有效性,比如:注册表,数据库,本地硬盘等等,在.net开发中经常使用的confg文件,很多时候也被改动,我们在使用前也应该进行检查.
这一些异常数据主要表现在:
   a)数据获取权限和安全性,比如访问文件的时候,没有足够的权限.
   b)数据不完整,很多数据不完整或者为空.
   c)数据格式不正确,不是我们需要的格式.
   d)数据无效.


3,程序本身的安全性
优秀的程序员应该具有良好的设计能力,以阻止程序代码的异常,

在调用一个object前,应该检查这个object是不是为null, 在使用ArrayList时,会引起装箱和拆箱的操作,在使用时更应该小心,还有比如线程安全,内存溢出等等.


4,要么处理,要么接着抛,决不能淹没
也就是说,遇到一个异常的时候,可以处理他,当无法处理的时候,应该自定义一个Exception,throw这个Exception,这样客户程序就能够捕获,而不是catch里面什么也没有做,

什么时候处理异常,什么时候往客户程序throw? 我觉得十分重要,再接来下的一篇文章里,我将专门整理一下.

 


5,在最靠近异常的地方捕捉

根据业务逻辑去设计try-catch的粒度,应该在最靠近异常的地方捕捉,这样更容易跟踪有问题的代码,如果需要throw异常的话,我们根据代码块的业务逻辑,给出准确可靠的message.


6,别throw new Exception()
Exception是一个很父类,太泛了,我们应该把它具体化,设计一些自定义的exception.


7,在catch一个exception的时候尽量别使用catch(Exception ex)
我们可以根据程序的逻辑,列举有可以发生的exception.比如:
try
{
 ......
}
catch(FileNotFoundException ex)
{
 ......
}
catch(FormatException ex)
{
 ......
}


8,最好记录Exception.ToString(),而不是Exception.Message
前者有大量描述堆栈(stack)信息,以便于我们追踪程序.而后面只是简单的错误描述,很多时候我们无法从这一些描述中得知产生exception的原因.

 

9,尽量少使用try-catch嵌套

多个try-catch嵌套的时候不仅容易淹没exception,造成客户程序无法获得准确的信息,而且很容易让开发人员忽视了这个exception.


10,我们每次Try-Catch后应该记得用Finally清除一些资源
比如关闭数据库的Connection,关闭Stream等等.

 

在现代的开发语言中,不管是Java,C/C++还是.Net,很多设计思想和经验是可以通用的,但愿能给大家点点参考.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值