🌕统一处理异常
一、美化报错页面
将防止404和500的图片文件夹以error文件名命名,放置在resources/static目录下
测试404容易,随便造一个不存在的路径;
测试500错误页面,人为造错:MessageController
重新编译测试:
http://localhost:8080/community/letter/list
http://localhost:8080/community/index/abc.html
二、异常处理
404 —— 处理方式也只能提示页面丢失
而500是服务端报错,报错后就需要记录日志
用来之后的分析;前台跳转500页面只是表面处理,内在需要记录日志。
demo:使用@ExceptionHandle
- 首先在HomeController里加上一个请求。因为服务器发生异常以后,我统一处理,记了日志。处理完以后,我得去到500的错误页面,这个时候因为是我们人为处理的,我们需要手动重定向过去,所以提前把500的页面请求访问给它配一下,增加一个请求的处理。
2.1 HomeController
/*异常处理*/
//1.获取错误页面
@RequestMapping(path = "/error",method = RequestMethod.GET)
public String getErrorPage(){
return "/error/500";
}
2.2 ExceptionAdvice
@ControllerAdvice(annotations = Controller.class) //窄化请求 —— 这个注解只扫描带有Controller注解的bean,也就是controller那些类
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response){
logger.error("服务器发送异常:"+e.getMessage());
for (StackTraceElement element:e.getStackTrace()){
logger.error(element.toString());
}
//额外处理:页面访问浏览器,可能普通请求/异步请求
//区分处理,这里判断一下是哪种请求
//怎么判断呢,下面;可以作为固定的技巧
String xRequestedWith = request.getHeader("x-requested-with"); //知道是哪种请求方式
if ("XMLHttpRequest".equals(xRequestedWith)){
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = null;
try {
writer = response.getWriter();
} catch (IOException ioException) {
ioException.printStackTrace();
}
writer.write(CommunityUtil.getJSONString(1,"服务器异常!Server exception"));
}else {
try {
response.sendRedirect(request.getContextPath()+"/error");
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
2.3 测试
测试统一处理异常有没有
- 故意在异步请求“发送私信”的方法放一个错误
然后浏览器测试该方法,是不是跳转500页面
成功!
三、好处
不需要对任何一个controller做处理(比如加代码),就能解决那些异常问题。