SpringMVC的异常处理

一、异常分类

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主
要通过规范代码开发、测试通过手段减少运行时异常的发生。

二、SpringMVC异常处理方式

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。
springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

三、自定义异常处理

1、自定义异常类

对不同的异常类型定义异常类,继承Exception。

public class ItemsException extends Exception {

    private String message;//异常信息
    //构造方法
    public ItemsException(String message){
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、全局的异常处理器

(1)处理方式:系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
(2)全局异常处理器处理思路:
 解析出异常类型,如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示,如果该异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
(3)springmvc提供一个HandlerExceptionResolver接口.

public class MyException implements HandlerExceptionResolver{
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse, Object o, Exception e) {

        ItemsException itemsException = null;
        //解析出异常类型
        //如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
        if(e instanceof ItemsException){
            itemsException =(ItemsException) e;
        }else{
            //如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
            itemsException = new ItemsException("未知错误");
        }
        //获取异常信息
        String message = itemsException.getMessage();
        //将异常信息添加到ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message",message);
        //将view添加到modelAndView
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

3、编写错误页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
    <head>
        <title>自定义异常</title>
    </head>
    <body>
        ${message}
    </body>
</html>

4、在SpringMVC的配置文件中配置全局异常处理器

<bean class="com.jack.Exception.MyException"/>

5、异常测试

controller异常:

   public ModelAndView queryItemById(@RequestParam(value = "id") Integer item_id) throws Exception{

        ItemsCustom itemsExtend = itemsService.queryItesmById(item_id);
        if(itemsExtend == null){
           throw  new ItemsException("商品信息不存在");
        }
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("itemsExtend",itemsExtend);
            modelAndView.setViewName("updateitem");
            return modelAndView;
    }

service异常:

 @Override
    public ItemsCustom queryItesmById(Integer id) throws Exception {
        ItemsCustom itemsCustom= itemsMapper.queryItesmById(id);
        if(itemsCustom == null){
            new ItemsException("商品信息不存在");
        }
        return itemsCustom;
    }

6、测试结果

原文地址:https://www.cnblogs.com/jack1995/p/7357609.html