Springboot 全局异常处理问题

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

现在在控制器里面 自己抛出一个异常

package com.hema.demo8.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class UserController {


    @RequestMapping("/getUser")
    @ResponseBody
    public String   getUser(){
        System.out.println("运算"+1000/0);  //抛出异常
        return  "ZW";
    }
}

如果此时配置了有错误页 那么一定会统一跳到500所在的路径上进行错误的显示
如果要进行一些详情内容 比如访问地址 报错的异常 等等
1.0 可以单独定义一个页面进行错误的信息显示处理 而这个页面 可以定义在
'src/main/view/templates/error.html'

  2.0 定义一个全局的异常处理类 
package com.hema.demo8.advice;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/*****
* 处理全局的异常和错误
* 作为一个切面进行处理
*/
@ControllerAdvice
public class GlobalExceptionError {

    /*****
     * 显示错误页面
     */
    public static final  String DEFAULT_ERROR_VIEW="error";
    @ExceptionHandler(Exception.class) //所有的异常都是Exception子类
    //出现异常会自动被这个方法切面掉 进行一个获取 显示
    public ModelAndView defaultModelAndView(HttpServletRequest request, Exception e
      ){
        ModelAndView modelAndView=new ModelAndView(DEFAULT_ERROR_VIEW);
        modelAndView.addObject("url",request.getRequestURL().toString());//获取请求路径
        modelAndView.addObject("error",e);//把异常信息传送到前台
        return  modelAndView;

    }

} 

定义error.html 页面 这里采用模板方式 所以要引入一个jar 包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

定义error.html 页面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Springboot 模板渲染 全局异常处理</title>

</head>
<body>


        访问路径:<p th:text="${url}"></p></br>
     错误信息:<p th:text="${error.message}"></p></br>
</body>
</html>

这种方式建议后端 后台 如果是前后分离 比如vue 项目 建议使用Rest 进行显示 建立一个错误日志实体类 用JSON 格式返回给前台

package com.hema.demo8.dataobject;

/*****
* 错误日志实体类
* 用于RPC 或者前后端分离项目返回给前端Rest风格的日志
*/
public class ErrorInfo {
    private Integer code;
    private String message;
    private String  url;

    public Integer getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
 修改全局异常类 
package com.hema.demo8.advice;

import com.hema.demo8.dataobject.ErrorInfo;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@RestControllerAdvice
public class RestGlobalExceptionError {

    private static final String DEFAULT_ERROR="error";

    @ExceptionHandler(Exception.class)

    public Object  modelAndView(HttpServletRequest request,Exception e){
        ErrorInfo errorInfo=new ErrorInfo();
        //假设102
        errorInfo.setCode(102);
        errorInfo.setMessage(e.getMessage());
        errorInfo.setUrl(request.getRequestURL().toString());
        return  errorInfo;
      }

}

不是面对所有的用户 那么最好的做法就是使用全局异常处理的方式完成

猜你喜欢

转载自blog.csdn.net/qq_32048567/article/details/88390150