exception handling application block
目标:
1. 曾经捕捉过的exception,不再记录。(日志方面)
2. 可以查看当前方法是否有exception。
利用反射,自动查询当前的方法是否存在exception。然后可以自动添加attribute
也可以深层递归,获取异常。
3. 当前的ex是否应该抛出。
---------------------------------------
什么时候应该抛出异常?
软件的一切都是围绕着方法调用,给出输入参数,获取期望值。
因此产生2个问题:
1. 没有给出符合要求的输入参数。
2. 没有返回符合要求的期望返回值。
是否应该抛异常,取决于 返回值 能否代表 失败的返回?
那么什么时候会产生失败的返回:
1. 没有给出符合要求的输入。
2. 内部由于外界因素,产生了超乎预期的操作(例如磁盘IO错误、网络、内存等)
3. 内部运算结果没有符合预期的结果(例如找不到)
---------------------------------------------------------------
那么,返回值到底包含那些?
1. 值类型,例如int/string/double
2. bool类型, 例如bool
3. 枚举类型, enum
4. 对象类型, 就是其他类型,包括接口、类、集合等。
-----------------------------------------------------------------
BOOLEAN ENUM
首先看bool类型,如果bool表示的是操作成功、失败,则绝对不能抛出异常。
如果是表示非方法调用的另外两种结果,例如IsGirl,那么如果出现1、2情况,抛出异常。
-----------------------------------------------------------------
INT DOUBLE。。。
再看值类型,一般值类型有代表失败的含义,例如int = -1; double = Double.MinValue等,那么什么时候抛出异常?
这个需要用户自己声明了,如果设定了失败操作的返回值,则不抛出异常,否则1、2抛出异常,3不需要抛出异常。
-----------------------------------------------------------------
String
和上文一直,有可能string = null代表操作失败。这个时候,不抛出异常。
否则,出现了1、2抛出异常。
-----------------------------------------------------------------
同上,如果null代表失败,那么不抛出异常。否则抛出。
抛出异常的可能性包括了:
1. 没有给出符合要求的输入。
2. 内部由于外界因素,产生了超乎预期的操作(例如磁盘IO错误、网络、内存等)
3. 内部运算结果没有符合预期的结果(例如找不到)
是否应该抛出异常,就取决于
1. 当前方法是否允许异常。
2. 当前方法的返回值能否代表失败。
所以,可以总结出:
1. 线程、异步操作属于“不允许异常”,所有异常都要捕捉。
2. 如果有返回值能代表方法失败,则不抛出异常。
3. 其余的一概抛出异常。
因此,一共有3种attribute,令+1种隐含的attribute,分别是:
1. 输入不符合要求:VerificationFailedException
2. 外界因素引起的exception,包括了系统自身的exception,和他们的总类:UnexpectedExternalException
3. 没有符合结果的异常,UnhandledResultException
和
4. 没有异常,NoException
以后一律只能使用以上3中异常,当抛出的时候,他们会调用反射堆栈,自动获取抛出点信息。不需要自己制定。
Exception Handle BLock 只是处理了当前的exception是否应该抛出。采用了全局的配置。目前没有参考价值。是否应该抛出,是由业务逻辑决定的。不应该是配置。
会抛出什么,又是由API框架包含了,也不应该从代码、反射中获得,否则性能非常低下。因此到目前位置,无法进一步开发。先终止了。
开始时间:2010-04-17 结束时间 2010-04-18.
实现了对当前exception 的封装,成为4种类型。同时记录了是否被handle,防止重复的处理。