Springboot之统一异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38361347/article/details/85225036

Springboot全局异常处理

在开发中经常会遇到一些异常,比如url不正确会产生404页面,获取一些参数,可能出出现一些异常,或者代码不规范莫名其其妙的异常问题,或者网络问题出现的异常。

结果可能会呈现出一些不太友好的页面给用户展示,这时候我们就需要处理一些异常的问题。
好在spring为我们提供了一种处理异常的机制。

SpringBoot 统一异常处理— @ControllerAdvice 使用

注解 @ControllerAdvice 我们可以将对于控制台的全局配置放置在同一个位置,注解了这个ControllerAdvice 的类可以当做一个全局的异常请求器来使用。

@ControllerAdvice 声名一个控制器,并且自动注册为bean ,@ControllerAdvice 结合了@Component注解

还为一些方法提供了一些注解:

@ExceptionHandler 用于全局控制器的方法注解,一般最常用。
@InieBinder 将键值对添加到全局,所有注解@RequestMapping的方法可以获取到
@ModelAttribute 定制WebDataBinder

###controller###
我们来自定抛出一个异常,用来模拟异常情况。

	@RequestMapping("showUser")
	public String showUser(Model model)  {
		throw  new MyException("xx");
	}

###全局异常处理类###

@ControllerAdvice //声名一个控制器,并且自动注册为bean
public class ExceptionAdvice {

    @ExceptionHandler(value = {MyException.class})   // 在此设置全局异常处理,可以通过value过滤请拦截的条件
   // @ExceptionHandler  // 在此设置全局异常处理,可以通过value过滤请求,默认是全部
    public ModelAndView excepetion(MyException e){

        ModelAndView mv = new ModelAndView();
        mv.addObject("exception",e);
        System.out.println("----" + e);
        mv.setViewName("error");
        return  mv;
    }

   //不常用
    @ModelAttribute  //将键值对添加到全局
    public void addAttributes(Model model){
        model.addAttribute("msg","信息");
    }
    
}

异常类:

public class MyException extends RuntimeException {

    public MyException(String message) {
        super(message);
    }
}

页面

<!DOCTYPE html>
<html  lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8" />
    <title>错误页面</title>
</head>
<body>

错误exception <span th:text="${exception}">  </span>

</body>
</html>

出现异常

image.png

###获取参数异常

  @ExceptionHandler
    @ResponseBody
    public ErrorData errorData(MyException e){
        return  new ErrorData("error",e.getMessage(),"0");
    }

返回的实体 ErrorData


public class ErrorData {

    String data;
    String mes;
    String code;


    public ErrorData(String data, String mes, String code) {
        this.data = data;
        this.mes = mes;
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getMes() {
        return mes;
    }

    public void setMes(String mes) {
        this.mes = mes;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

总之不管是跳转页面还是获取出具出现错误,都是最终先请求controller,然后出现异常问题controller抛出异常,再由全局异常处理器进行异常处理,通过自己 注解@ExceptionHandler进行页面跳转异常处理或者获取数据异常处理,返回给异常页面提示或者请求出错后的错误信息!

猜你喜欢

转载自blog.csdn.net/weixin_38361347/article/details/85225036