日期:2014-05-18  浏览次数:20876 次

怎样重构C#异常处理
最近刚针对基于Windows Mobile/CE的C#项目中的异常处理做了一次小的重构,现分享给大家。不足之处,欢迎大家指正。
注:相关项目并没有引用任何异常处理库。
 
异常处理指导原则及最佳实践(Rules&Best Practice):
1.善用finally块,在一下场景中不需要额外使用try...catch块
a.使用lock语句时,锁会在finally块中释放
b.使用using语句时,会在自动生成的finally块中调用对象的Dispose方法
c.使用foreach语句时,会自动在生成的finally块中调用IEnumerator对象的Dispose方法
d.如果你的类定义了析构函数,编译器会在你的析构函数中自动生成try...catch块,并在其finally块中调用基类的Finalize方法

2.异常处理最佳实践
参考资料:
http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET


现状:
由于现在项目基本上没有使用自定义异常类型,因此根据自定义异常类型进行处理处理的方法在项目中并不可行。
由此,我们并不能依据现有的异常来判断哪些异常是可恢复的,同理对于那些涉及数据完整性的异常处理,我们都无从判断。

目标(Goal):
依据C#代码标准中关于异常处理的最佳实践并结合RPNet的现状大范围的减少代码中不必要的try...catch块
在不同层中针对不同的异常类型做不同的处理

方案(Solution):
1、在数据层定义数据出错异常
2、相应的在业务层定义业务逻辑异常
3、在界面层中的界面事件函数中捕获异常,如果是数据及业务异常则加日志并rethrow
4、其他在界面中捕获的异常做简单的捕获和日志处理,并不重新抛异常

清除冗余异常处理的步骤(Action List):
1.如果Catch块中没有任何逻辑代码,而且也没有finally块代码,那么把整个try...catch块都移除
2.如果Catch块中只有 throw ex,而且也没有finally块代码,那么把整个try...catch块移除
3.还没有想到 :), 欢迎大家分享你们的经验