工程如下所示:
error页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>错误</title>
</head>
<body>
错误
<!——使用themyleaf模板在控制台以及网页源代码中打印错误信息,<转义字符。——>
<div>
<div th:utext="'<!--'" th:remove="tag"></div>
<div th:utext="'Failed Request URL : ' + ${url}" th:remove="tag"></div>
<div th:utext="'Exception message : ' + ${exception.message}" th:remove="tag"></div>
<ul th:remove="tag">
<li th:each="st : ${exception.stackTrace}" th:remove="tag"><span th:utext="${st}" th:remove="tag"></span></li>
</ul>
<div th:utext="'-->'" th:remove="tag"></div>
</div>
</body>
</html>
web里面的Controller
package com.mjf.blog.web;
import com.mjf.blog.NotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController{
@GetMapping("/")
public String index(){
// int i=9/0;
String blog=null;
if (blog==null){
throw new NotFoundException("博客不存在");//原本跳到NotFoundException这个类,然后通过
这个返回404,可是在统一拦截那块,被拦截,所以在拦截那个方法里面添加一个判断条件。
}
return "index";
}
@GetMapping("/blog")
public String blog(){
return "blog";
}
}
handler页面:
package com.mjf.blog.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* 自定义拦截异常,统一异常处理
*/
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
//访问哪个路径的问题
public ModelAndView exceptionHandler(HttpServletRequest request,Exception e) throws Exception {
///第一个参数 打印异常的地址,第二个是打印异常的信息
logger.error("Request URL : {}, Exception : {}",request.getRequestURL(),e);
//判断 如果前台需要打印404,或者505,就让它通过这个条件来自己打印错误404.html网页。而不是统一异常处理。
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv=new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception",e);
mv.setViewName("error/error");
return mv;
}
}