一、异常处理思路
系统中异常包括两类:自定义异常和运行时异常RUN提么E猜测铍铜,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws new Exception()向上抛出,最后
springmvc前端 控制器交由异常处理器进行异常处理。
SpringMVC提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
二、自定义异常
自定义异常需要继承 Exception
/**
* 系统自定义异常类,针对自定义的异常,需要再程序中抛出此类的异常
*
* @author ding
* @since 2024/6/18
*/
public class CustomException extends Exception{
public CustomException() {
super();
}
//message:异常信息
public CustomException(String message) {
super(message);
}
}
三、全局异常处理器
1.需要准备自定义异常
2.实现实现HandlerExceptionResolver接口,重写其中的resolveException()方法
3.在SpringMVC配置类中重写extendHandlerExceptionResolvers()
定制全局异常处理器
//全局异常处理器
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new MyHandlerExceptionResolver());
}
4.新建error.html错误页面,将来显示异常信息
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>错误页面</title>
</head>
<body>
<h3 style="color: lightcoral">[[${errors}]]</h3>
</body>
</html>
5.业务逻辑执行时,满足条件则抛出自定义异常
系统遇到异常,在程序中手动抛出(throw new CustomException ("message")),dao抛给service,service抛给controller,controller抛给前端控制器,前端控制器抛给全局异常处理器。
全局异常处理器处理异常时,首先解析该异常是否为自定义异常,若不是,则抛出 “未知错误”。如果类型为自定义异常,则将自定义异常的具体异常信息去除,并通过 MovelAndView 将信息传递给错误信息页面。
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("handler = "+handler);
System.out.println("ex = "+ex);
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("未知错误");
}
ModelAndView mv = new ModelAndView();
mv.addObject("errors" , customException.getMessage());
mv.setViewName("error");
return mv;
}