我们在程式中经常遇到异常, 但大多情况下我们的开发人员没有遵循一套正常或有系统的处理机制.以致于出现已知的错误给操作人员(用户)的消息不准确,出现未知的错误给不出准确的原因或出错的位置给开发人员.
以下根据我的个人经验给出一套处理异常的整个过程(以C/S系统为例,B/S出大同小异).
基本上我的原则是,各模块处理各自的错误,严格区分已处理的错误和未处理的错误,尽可能把已处理错误的详细信息告诉操作人员(用户), 把未处理的错误信息告诉开发人员.
为什么区分已处理的错误和未处理的错误,由于开发过程中,已处理的错误是开发人员考虑过的异常,而未处理异常的开发人员没有想到的.可能导致意想不到的错误.
区分己处理的错误信息和未处理的错误信息,最好的办法是定义自己的异常类(注意尽可能要源错误放到innerException里).
public class MyException:Exception
{
public ExceptionType ExceptionType{get;set
public string Code{get;set;}//Code is used to distinglish which exception.
......
}
如果接收到的错误是自己定义的异常,则可以认为是已经处理过的错误信息,调用者如果没有特殊处理,则就可以直接Throw到最上层显示给用户(不否认中间会重新处理).
接下来我举两个Case说明怎样处理异常
1. 常规的处理法

大家注意到我们尽可能的把已处理的错误扔给最终用户.而对未处理的异常进行处理,如果你觉到没有预测到有什么异常,那你可以不用去处理任何异常.你会发现除了顶层会显示消息和报告消自给开发人员这层处理不同外,其他都是相同的处理方式.如果是C/S,最顶层基本上是DispatchUnprocessException事件.
我个人认为大部分是属于这种处理现像.
2. 中间层可能会重新处理底层的已经处理过的异常

大家注意到中间层会根据类型或Code重新处理.
一般来讲,我们应尽可能的不要出现下面的情况

大家可能想一下,如果出现上面的错误信息,客户会有什么反应?我个人认为,他会再多试几次,如果是Free的,第一个反应是该软件不好用,再查找其他原因,如果是大型软件,他会直接要网管打电话给软件供应商,但如果报出详细的信息,我认为效果会不一样.
这是我四年来第一次写blog. 可能有大量的错误存在,请大家原谅
另外MS也有一个Exception Handler, 但我认为他没有给出过程, 只给出集中处理错误和Throw方式, 对于扩展个人认为上比较麻烦的,如比多语言等.其他方面还是比较好的.
详细请看:http://www.cnblogs.com/rickie/archive/2005/02/12/103862.html
另外有一个关于处理Exception的原则,虽然有些观点我不赞成,但个人认为是写得比较好的
http://blog.csdn.net/netjxz/archive/2007/07/25/1707304.aspx
VCS特点
1. 多数据库的支持
大家知道,要实现多数据库的支持,尽量要求用户不用写SQL语句,该框架就是为这个目标来实现的,只要在逻辑层写好业务逻辑后;如果要更改数据库,则只需要重新提供不同的DAL层。
2. 尽量使使用者少写代码.
不管是编写业务逻辑,还是在界面上调用,都应该要求代码量尽量的少及调用方便。
3. 尽量使初学者方便使用.
本框架是以对象的方式组织的,完全是面向对象的。
4. 尽量要求维护方便(包括数据库及逻辑的更改)
该框架是以对象为基础,所以对象的方法和属性是以一个类来组织的;为什么该框构没有把属性与方法分开或实体类和操作类呢?大家知道,大多数框架是把操作类和实体类分开,使得业务逻辑单独在操作类里面,为什么该框架没有分开呢?是由于C#2.0本身就有一个好的功能:partial,这个功能可以把操作和实体放在一个类的两个文件里,也同样使逻辑与实体分开,方便维护,而且更直观,更面向对象。
5. 尽量提高性能
在该框架里只是少量的使用了反射,而且读取数据也尽量使用DBDataRender的方式,虽然反射最终影响的性能只有那么百分之几,但积累起来也不可少看。
6. 事务处理
本框架使用的是线程的方式来组织事务的
7. 方便重新组织重构。
用生成器生成类的同时,也生成了相应的XML文件,如果以后要组织重构(比如:抽象处理/增加属性等),可以通过生成的XML在生成器上做相应的更改后,直接生成代码即可。
8. 支持对象的null值处理
下载框架:
http://www.cnblogs.com/luoqing/archive/2006/04/24/383674.html
如果有什么建议,请到http://vcsproject.com/forums/3/ShowForum.aspx
如果要获取更多的信息,请到http://vcsproject.com/forums/3/ShowForum.aspx
在原有的VCS Framework 0.9.0的基础进行改正,现发布VCS Framework0.9.8
希望各位朋友多提点建议,或直接发Email至:Robert_luoqing@hotmail.com
VCS Framework0.9.8改进的内容
1、数据库不再有只有GUID为主键的限制
2、数据库不再需要有SSIndex列
3、数据库支持Identity为主键
4、支持以对象的方式联级新增或修改或删除
5、重构以方便高级使用都扩展
6、支持枚举类型变量
7、修改了Bug
VCS Framework仍有以下限制:
一个表必须且一定只有一个主键。
下载:
VCSFramework0.9.8.rar
Generator0.9.8.rar(需要安装Codesmith3.2)
更用说明:
(源程序里含有一个样例及样例的规格说明书.)
COM.VCS.Simple------样例的原代码(sql.sql是样例的数据库脚本/贸易管理系统需求规格说明书.doc是样例的说明书),数据库连接在COM.VCS.Simple/ConnectionHelper/ConnectionHelper.cs类里.
App.VCS.Simple--------样例的界面.
其他组件:
COM.VCS.Framework----框架的核心组件
COM.VCS.Type-----类型组件
COM.VCS.Exceptions-----异常处理类
COM.VCS.Pooling---对象池
COM.VCS.Tools----工具类
DAL.VCS.COMM----DAL的接口类
DAL.VCS.DataService-----DAL类
DAL.VCS.SQLFactory----DAL工厂类
DAL.VCS.SQL2005----SQL2005的SQL组成类
VCS Framework0.9.0:http://luoqing.cnblogs.com/archive/2006/04/13/374241.html
如果有什么建议,请到http://vcsproject.com/forums/3/ShowForum.aspx
如果要获取更多的信息,请到http://vcsproject.com/forums/3/ShowForum.aspx