springmvc异常统一处理

前言

在日常开发中,自己写的代码中总是有各种各样的异常,不管是受查异常还是非受查异常。对于异常我们可以在每个方法里面去去捕获异常,然后跳转到对应的异常页面中,但是这样的话就会导致代码侵入比较严重,耦合性差,同时在每个方法里面都进行异常捕获处理,这样效率也比较低。
那么有没有一种好的方式来解决这个问题呢,其实spring已经帮我们处理好这个问题了,具体的处理流程请看下图。
这里写图片描述
从上图中可以看出来,Controller,Service,Dao中的异常是都是被springmvc的前端控制器DispatchServlet来统一进行处理,这样就不用在每个模块都进行异常处理了。
那么springmvc又是通过什么方式来对异常进行统一处理的呢??

通过SimpleMappingExceptionResolver进行处理

SimpleMappingExceptionResolver是springmvc自带的一个统一处理异常的类,可以从源码中可以看出SimpleMappingExceptionResolver是实现了springmvc的异常统一处理接口HandlerExceptionResolver
继承自AbstractHandlerExceptionResolver
这里写图片描述
然后又实现了HandlerExceptionResolver
这里写图片描述
如果我们要通过上述方法来实现异常的统一处理,需要在springmvc的配置文件中配置个bean,具体代码如下

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Throwable">/error/error</prop>
            //这里可以匹配自己定义的自定义异常
            <prop key="com.aiqinhai.common.MyselfException">/error/myError</prop>
        </props>
    </property>
</bean> 

异常测试类

/**
 * 
 * @author 爱琴孩
 *测试异常处理
 */
@Controller
@RequestMapping("/testController")
public class TestController {

    @RequestMapping("/test")
    public String test() throws MyselfException{
        System.out.println("进入到这个方法里面!");
        try {
            int i=3/0;
        } catch (Exception e) {
            // TODO: handle exception
            throw new MyselfException("被除数不能为0");
        }
        return "upload";
    }
}

测试结果如下
这里写图片描述

通过增强@ControllerAdvice来进行异常处理

自己定义一个增加Controller,具体代码如下

/**
 * 
 * @author 爱琴孩
 *定义增强Controller来统一处理异常
 */
@ControllerAdvice
public class ExceptionResolveController {
    @ExceptionHandler(value=MyselfException.class)
    public String resovleException(){
        System.out.println("所有的异常都是在这里进行处理");
        return "error/404"; 
    }
}

上面的@ControllerAdvice是运行时类注解,被注解的类可以被容器扫描到
这里写图片描述
当然还有要在springmvc的配置文件中配置,能扫描@ControllerAdvice

<context:component-scan base-package="com.aiqinhai" use-default-filters="false">
        <context:include-filter type="annotation" 
        expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" 
        expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>

其实上面的还是要靠增强Controller中的@ExceptionHandler注解,这个注解才是解决异常的关键,当然,我们可以不用@ControllerAdvice,在一个基础类中定义一个方法,然后加上@ExceptionHandler注解,后面我们新增的业务Controller只需要继承这个基础类就可以了。

在web.xml中配置异常页面

在web.xml中加入下面这些代码就ok了,他就会根据异常的状态吗或者异常的类型来映射对应的异常页面

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/WEB-INF/views/error/error.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/views/error/error.jsp</location>
</error-page>

总结

上面的几种方式,各有优势,能够获取简单的异常信息,但是对于异常信息之外的消息获取就不是很方便了,对于SimpleMappingExceptionResolver,是springmvc中自带的异常处理类,当然我们也可以自己实现HandlerExceptionResolver接口,来自定义自己的全局异常处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱琴孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值