版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}
不是面对所有的用户 那么最好的做法就是使用全局异常处理的方式完成