异常处理
我们在程式中经常遇到异常, 但大多情况下我们的开发人员没有遵循一套正常或有系统的处理机制.以致于出现已知的错误给操作人员(用户)的消息不准确,出现未知的错误给不出准确的原因或出错的位置给开发人员.
以下根据我的个人经验给出一套处理异常的整个过程(以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