作为一个类库开发的新手,在面对Exception时,一直不知道所措。阅读了<CLR via C#>的异常处理部分,记录下一些基本的原则,供日后查询并与大家分享。欢迎高手指点一二。
一、善用finally块
应当将一些打开的资源在finally块中进行清理;
C#的一些语言提供了相应的实现,编译器通过为这些语言添加try/finally块实现。如:
-- lock: 锁会在finally块释放;
-- using: 会调用对象的Dispose方法;
-- foreach: 会在finally块调用IEnumerator对象的dispose方法;
-- 定义析构器:会在finally块中调用基类的Finalize方法;
二、不要什么都捕捉
如果catch一个异常,表明你预见到该异常,理解它为什么发生,并知道如何处理它。
如果catch Exception,并做一些操作,最好是在末尾重新抛出异常,不能将System.Exception异常悄悄地“吞噬”,应当抛出让应用程序处理;
三、得体地从异常中恢复
如果已经预料到会抛出某些异常,应该Catch这些异常并做相应的恢复工作,使程序得以继续执行;
四、发生不可恢复的异常时回滚部分完成的操作——维持状态
五、抛出新的异常时要注意:
--隐藏真正的异常;
--新的异常抛出的位置与原异常发生的位置不同,不利于调试;
六、TypeInitializationException
如果一个类型构造器(静态构造器)抛出一个异常,而且该异常未在类型构造器方法中捕捉,则CLR就会在内部捕捉该异常,改为抛出TypeInitializationException。这样就可以清楚地知道是哪里出错了。
七、关于未处理异常
类库开发人员不用考虑,只有应用程序开发人员需要关心未处理的异常。
对于服务器应用程序,未处理异常不应当客户端。服务器尽量减少暴露关于自己的信息。