在Spring基础上实现自己的异常处理框架
时间:2011-01-02
该异常处理框架满足的要求:
完整的异常组织结构
异常的统一处理
可配置,受管式,方便使用
完整的异常组织结构:
用户可以方便的定义自己的异常,但所有UncheckedException需要继承BaseAppRuntimeException,所有的checked Exception可以继承BaseAppException,或者需要抛出且不需要check时用WrapperredAppException封装后抛出
合理地使用checked异常
Exception有唯一的error code,这样用户报告异常后,可以根据异常号找到相应Exception,把exception直接显示给用户也没有太大的意义,如何纪录exception那就是下文讲到的ExceptionHandler的职责了。
如果是第三方包括jdk中的异常,需要封装成BaseAppException或者BaseAppRuntimeException后抛出
在Spring基础上实现自己的异常处理框架(2)
时间:2011-01-02
统一的异常处理
异常统一在框架中进行处理,不需要在上层应用的代码中去处理抛出的异常。为了尽量捕捉到所有的异常,将异常处理放在了ActionBroker中,这样凡是action以后抛出的异常都可以捕捉到,因为webservice只是简单的调用action类的方法,一般不会出现异常。当我们捕捉到异常后,需要进行异常处理,定义了ExceptionHandler接口,用接口抽象出异常处理类的具体实现。
USFContextFactory: 创建ExceptionContext的工厂
package com.ldd600.exception.context;
2
3public class CoreContextFactory {
4 private static CoreContextFactory instance;
5
6 private volatile ExceptionContext exceptionContext;
7
8 private Object exceptionContextLock = new Object();
9
10 private CoreContextFactory() {
11
12 }
13
14 public static synchronized CoreContextFactory getInstance() {
15 if (null == instance) {
16 instance = new CoreContextFactory();
17 }
18 return instance;
19 }
20
21 public ExceptionContext getExceptionContext() {
22 ExceptionContext tempExpContext = exceptionContext;
23 if (tempExpContext == null) {
24 synchronized (exceptionContextLock) {
25 tempExpContext = exceptionContext;
26 if (tempExpContext == null)
27 exceptionContext = tempExpContext = new ExceptionContext();
28 }
29 }
30 return tempExpContext;
31 }
32}
33
在Spring基础上实现自己的异常处理框架(3)
时间:2011-01-02
ExceptionContext: 存放全局的exception信息
1package com.ldd600.exception.context;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.Collections;
6import java.util.HashMap;
7import java.util.List;
8import java.util.Map;
9import java.util.Set;
10
11import org.springframework.util.Assert;
12
13import com.ldd600.exception.base.BaseAppRuntimeException;
14import com.ldd600.exception.base.ConfigException;
15import com.ldd600.exception.base.handler.ExceptionHandler;
16import com.ldd600.exception.config.ExceptionDefinition;
17
18public class ExceptionContext {
19 private Map<Class<?>, ExceptionDefinition> exceptionMap;
20
21 private Map<String, ExceptionHandler> handlers = new HashMap<String, ExceptionHandler>();
22
23 ExceptionContext() {
24 exceptionMap = ne
|