SpringMVC异常处理机制

2,045 阅读3分钟

SpringMVC作为一个优秀的Web层开发框架,在框架中已经集成了异常处理机制,可以帮我们我们灵活地处理程序中发生的异常,提高了我们程序的稳定性,令我们对程序运行中发生的异常更加可以控制,今天我们讲的就是SpringMVC框架中的对于异常的处理机制。 本文中的所有程序都是基于SSM框架环境,以上一篇博文SSM框架整合为基础。

没有异常处理机制的时候

首先,我们在程序的Service层引入一个异常:

@Override
public List<User> findAll() throws Exception {
    int i= 1/0;	//java.lang.ArithmeticException: / by zero 算数运算异常
    return userDao.findAll();
}

当我们运行程序,并调用该方法时,页面发生如下情况:

在这里插入图片描述毫无疑问,对于不懂计算机知识的访问用户来说,这是一个极其不友好的界面,而我们在开发中应该尽量避免这种情况的发生,避免这种对用户不友好的情况发生。 SpringMVC中对于这种情况的处理机制,就被称作是异常处理机制。该机制可以让用户访问程序的时候,如果发生程序异常,那么会选择一种友好的方式提醒用户。

SpringMVC中对于异常的处理机制一共有三种,分别是:

  • SpringMVC内置异常处理机制
  • HandlerExceptionResolver自定义异常处理机制
  • @ExceptionHandler异常处理机制

1、SpringMVC内置异常处理机制

SpringMVC框架内置的异常处理机制,可以直接在SpringMVC的配置文件中配置异常处理。

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
   <property name="exceptionMappings">
        <props>
        	<!--key是需要处理的异常类型,error是异常处理是跳转的页面,需要注意,该页面同样会经过视图解析器,所以直接配置页面的名字就可以了-->
            <prop key="java.lang.Exception">error</prop>
        </props>
    </property>
</bean>

配置完成之后,再次运行程序,发生异常之后就会出现如下界面:

在这里插入图片描述

这是页面是我们自己写的error页面,这个页面就比原生的异常页面要友好的多了,而且在正式开发中,完全可以由前端开发人员制作一个精美友好的错误页面,让用户可以获得良好的访问体验。

2、HandlerExceptionResolver自定义异常处理机制

HandlerExceptionResolver自定义异常处理机制,需要我们自己写一个异常处理的类,并实现HandlerExceptionResolver接口,并重写其中的resolveException方法,需要注意的是,我们需要在这里类上加上 @Component注解,表示它也是一个被Spring管理的JavaBean。

@Component
public class MyException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView model = new ModelAndView();
        model.addObject("message",ex.getMessage());
        model.setViewName("error");
        return model;
    }
}

当使用这种机制处理异常,程序发生异常时情况如下:

在这里插入图片描述

不但有错误提示,还有错误的信息。

3、@ExceptionHandler异常处理机制

SpringMVC框架的第三种异常处理机制,就是使用@ExceptionHandler注解进行异常处理。 在Controller中写一个方法,并在该方法上使用@ExceptionHandler注解,当这个Controller中发生异常的时候,该注解的方法就会处理异常。

@ExceptionHandler
public String myException(HttpServletRequest request, Exception ex) {
    return "error";
}

【注意】被@ExceptionHandler注解的方法的参数必须是固定的,否则运行时无法生效。

使用这种异常处理机制,异常发生时页面如下:

在这里插入图片描述

当然,使用@ExceptionHandler注解处理异常的时候,也可以配置全局异常处理。 单独写一个类,并在该类上使用@ControllerAdvice注解,那么这个类就是全局异常处理类。

@ControllerAdvice
public class MyException{
    /**
     * 该注解的值为需要处理的异常类型的字节码对象数组,可以定义多个
     * @param request 固定参数HttpServletRequest,不写会报错
     * @param ex 固定参数Exception,不写会报错
     * @return 自定义,可以是String,也可以是ModelAndView
     */
    @ExceptionHandler({RuntimeException.class, FileNotFoundException.class})
    public String myException(HttpServletRequest request, Exception ex) {
        request.setAttribute("message",ex.getMessage());
        return "error";
    }
}

使用@ExceptionHandler注解进行全局异常机制处理,当程序运行时发生异常,情况如下:

在这里插入图片描述

结束

SpringMVC的三种异常处理机制各有优劣,各位在使用SpringMVC的异常处理机制的时候,可以根据实际需求和自身喜好来进行配置开发。