表现层(Controller)处理异常
由于在三层架构中异常抛出逐级给上层处理,因此我们只需在表现层处理异常即可。
统一处理异常
- @ControllerAdvice
– 由于修饰类,表示该类是Controller的全局配置类。
– 在此类中,可以对Controller进行如下三种全局配置:
异常处理方案
绑定数据方案
绑定参数方案 - @ExceptionHandler
– 用于修饰方法,该方法会在Controller出现异常后被调用,用于捕获到的异常。 - @ModelAttribute
– 用于修饰方法,该方法会在Controller方法执行前被调用,用于为Model对象绑定参数。 - @DataBinder
– 用于修饰方法,该方法会在Controller方法执行前被调用,用于绑定参数的转换器。
SpringBoot统一处理异常方法
将错误页面按错误状态命名并放于templates/error目录下
Spring处理异常方法
//声明处理带有@Controller注解的类出现的异常
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
public static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.error("服务器发生异常:" + e.getMessage());
//从异常栈中取出异常
for (StackTraceElement element : e.getStackTrace()) {
logger.error(element.toString());
}
String xRequestedWith = request.getHeader("x-requested-with");
//如果头部中x-requested-with是XMLHttpRequest,说明是ajax请求,返回JSON字符串
if ("XMLHttpRequest".equals(xRequestedWith)) {
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(1, "服务器异常!"));
} else {
//否则是普通请求,返回错误状态页面
response.sendRedirect(request.getContextPath() + "/error");
}
}
}