SpringWeb异常处理

本人转载自 http://www.521100.net/spring-web-exception-hander.html

DispatcherServlet 在收到容器刷新事件时,初始化各项内容(方法:initStrategies),此方法中将初始化异常处理<br/>

initHandlerExceptionResolvers (context);<br/>
由于detectAllHandlerExceptionResolvers = true;默认为ture,所以加载异常处理过程在红框中进行
加载所有HandlerExceptionResolver类型的对象,由此可以得出,我们自己也可以实现该类型(HandlerExceptionResolver)
从而自定义异常处理,这是自定义异常处理的方法之一。

下面是spring默认加载的
1.ExceptionHandlerExceptionResolver<br />
2.ResponseStatusExceptionResolver<br />
3.DefaultHandlerExceptionResolver<br />
那现在有了三个异常HandlerExceptionResolver,在处理的时候用到哪个呢?
首先,做了一个排序
OrderComparator.sort(this. handlerExceptionResolvers );
其次,看看HandlerExceptionResolver的使用地方 DispatcherServlet的processHandlerException方法
可以看到HandlerExceptionResolver处理器会按顺序执行,一旦处理成功则返回view,则不再使用其他HandlerExceptionResolver
也就是说HandlerExceptionResolver 会按顺序执行,哪个处理成功就使用哪个。
那现在继续看下spring默认给出的三个HandlerExceptionResolver 
1.ResponseStatusExceptionResolver
ResponseStatusExceptionResolver.doResolveException方法
由此可以看出,它会处理异常上定义了ResponseStatus注解的异常类型
2.DefaultHandlerExceptionResolver
public DefaultHandlerExceptionResolver() {
            setOrder(Ordered. LOWEST_PRECEDENCE);
}
通过观察其doResolveException方法可以看出此ExceptionResolver负责的是Spring内部定义的异常。
3.ExceptionHandlerExceptionResolver 这个是最复杂的一个
protected ServletInvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception)由这个处理方法可以看,他的处理可以使用两种方法定义.
一种定义方式,是请求处理类中定义了@ExceptionHandler注解的,他匹配的是 注解中指定的异常类型,或者参数中的异常类型,如下面


        @ExceptionHandler(value = IllegalArgumentException.class)
        public void handleException(Exception e) {
              // TODO handleException
      }
     
        @ExceptionHandler
        public void handleException(IllegalAccessException e) {
              // TODO handleException
      }

分别处理两个异常IllegalArgumentException 和 IllegalAccessException

另一种定义方式:
在任何一个对象上加入ControllerAdvice 注解,那么他所处理的异常类型一样是 通过 @ExceptionHandler声明 例
@ControllerAdvice
public class ExceptionProcessor {
     
@ExceptionHandler
public void handle(Exception e, HttpServletResponse response) throws Exception {
   // handle exception
        }
}
这种方式的好处是,可以把异常统一处理,前一种放在了每一个@Controller内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值