SpringBoot2.X学习第十三课(SpringBoot全局异常处理)

在项目开发过程中难免遇到异常,如果不进行处理的话直接返回给前端的话就会非常不友好,这里我们就进行SpringBoot异常处理的讲解,官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling

一.全局异常处理

首先我们先制造一个异常看看返回是什么,新建一个ExceptionController:

@RestController
public class ExceptionController {
    @GetMapping("/v1/api/testException")
    public Object index() {
        int i= 1/0;
        return new User(11, "sfsfds", "1000000", new Date());
    }
}

访问接口查看结果发现报错:

SpringBoot2.X学习第十三课(SpringBoot全局异常处理)_第1张图片

 这样返回给前端就是非常不友好的,这时候我们就要进行一个全局的异常处理,新建一个handler,加上注解@ControllerAdvice(@ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody,如果是返回一个逻辑视图就直接加@ControllerAdvice,不要加@ResponseBody),如果发生异常那么就会走到这里

SpringBoot2.X学习第十三课(SpringBoot全局异常处理)_第2张图片

@RestControllerAdvice
public class ExceptionHandler {

        private static final Logger LOG = LoggerFactory.getLogger(ExceptionHandler.class);

        //捕获全局异常,处理所有不可知的异常
        //@ResponseBody
        @org.springframework.web.bind.annotation.ExceptionHandler(value = Exception.class)
        Object handleException(Exception e,HttpServletRequest request){
            LOG.error("url {}, msg {}",request.getRequestURL(), e.getMessage());
            Map map = new HashMap<>();
            map.put("code", 100);
            map.put("msg", e.getMessage());
            map.put("url", request.getRequestURL());
            return map;
        }
}

下面我们进行启动访问:

这样返回就非常直观了,前端可以直接根据我们返回的code进行对应的操作!

二. 自定义异常

1.先新建一个异常类MyException

public class MyException extends RuntimeException {

    public MyException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private String code;
    private String msg;
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}

}

2.在ExceptionHandler加上一个方法:

SpringBoot2.X学习第十三课(SpringBoot全局异常处理)_第3张图片

/**
     * 功能描述:处理自定义异常
     * @return
     */
    @org.springframework.web.bind.annotation.ExceptionHandler(value=MyException.class)
    Object handleMyException(MyException e,HttpServletRequest request){
        //返回json数据,由前端去判断加载什么页面
        Map map = new HashMap<>();
        map.put("code", e.getCode());
        map.put("msg", e.getMsg());
        map.put("url", request.getRequestURL());
        return map;

    }

这时候程序中抛出一个MyExcepiton的时候就会进入到这个处理方法,我们可以自定义很多个异常,在这边进行逻辑处理就行,

下面新建一个接口手动抛一个MyException异常进行测试:

SpringBoot2.X学习第十三课(SpringBoot全局异常处理)_第4张图片

 /**
     * 功能描述:模拟自定义异常
     * @return
     */
    @RequestMapping("/api/v1/myext")
    public Object myexc(){

        throw new MyException("499", "my ext异常");

    }

访问测试,发现我们自定义的异常已经起作用了

自定义异常的流程与全局异常一样,都是代码中抛出了一个异常,被Spring捕获到了,然后就会到有@ControllerAdvice注解的类中,找到该类定义的异常处理办法,也就是抛出的异常匹配value值,如下图:匹配到之后就返回一个自定义的页面,不过一般现在是前后端分离,直接返回一个json数据由前端进行处理就行。

SpringBoot2.X学习第十三课(SpringBoot全局异常处理)_第5张图片

源码地址:https://gitee.com/xuxinsunqizheng/SpringBoot2.0.git  

你可能感兴趣的:(springboot)