SpringMVC异常处理的四种方式

150 阅读2分钟

SpringMVC异常简介

系统中异常包括两类:预期异常(检查型异常)和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息, 后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。 系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理。

1.局部异常处理器

使用注解@ExceptionHandler来处理异常 value值可以是数组,所以可以添加许多可能出现的异常

@Controller
public class ControllerDemo1 {
    @RequestMapping("test1.action")
    public String test1(){
        int i = 1/0;
        return "success.jsp";
    }
    @RequestMapping("test2.action")
    public String test2(){
        String s =null;
        System.out.println(s.length());
        return "success.jsp";
    }
    @ExceptionHandler(value ={ArithmeticException.class,NullPointerException.class} )
    public ModelAndView handelException(){
        ModelAndView mv =new ModelAndView();
        mv.setViewName("error1.jsp");
        return mv;
    }
}

当出现出现算数运算异常或空指针异常的时候就会在浏览器上跳转自己设计好的异常页面

image.png

使用注解的方式的缺点:只能处理当前Controller中的异常

2.全局异常处理器

顾名思义,全局异常处理器与局部异常处理器的唯一区别:扫描的范围更加广。 因此需要在配置文件中配置相关的包扫描路径。

@ControllerAdvice
public class GloableExceptionHandler  {
    @ControllerAdvice
    public class GloableExceptionHandler1 {
        @ExceptionHandler(value ={ArithmeticException.class,NullPointerException.class} )
        public ModelAndView handelException(){
            ModelAndView mv =new ModelAndView();
            mv.setViewName("error1.jsp");
            return mv;
        }
    }
}

image.png

配置相关路径:

<context:component-scan base-package="com.**.exceptionhandler"/>

3.使用:SimpleMappingExceptionResolver

简单映射异常处理器

配置.xml

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.ArithmeticException" >redirect:/error1.jsp</prop>
            <prop key="java.lang.NullPointerException" >redirect:/error2.jsp</prop>
        </props>
    </property>
</bean>
<prop key = "出现异常的全类路径名称">需要跳转的页面</prop>

除了用xml配置外还可以用配置类配置,相当于将.xml的配置通过配置类来实现

@Configuration
public class GloableException  {
   @Bean
   public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
       SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
       Properties prop = new Properties();
       prop.put("java.lang.ArithmeticException","error1.jsp");
       prop.put("java.lang.NullPointerException","error2.jsp");
       resolver.setExceptionMappings(prop);
       return resolver;
   }
}

4.自定义的HandlerExceptionResolver

@Configuration
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mv = new ModelAndView();
        if(ex instanceof NullPointerException){
            mv.setViewName("error2.jsp");
        }
        if(ex instanceof ArithmeticException){
            mv.setViewName("error1.jsp");
        }
        mv.addObject("msg",ex);
        return mv;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    this is error1
    ${msg}
</body>
</html>

与方式三配置方式类似,需要创建一个配置类来实现HandlerExceptionResolver接口,重写resolveException方法,此方法可以将异常信息返回到浏览器界面可以自定义返回的类容

image.png

注:从第二个开始全都是全局异常处理