springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
1 异常处理器的思路
- 预期异常:通过捕获异常,从而获取异常信息。
- 运行期异常:通过规范代码,减少运行期异常。
2 异常处理器接口
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
public interface HandlerExceptionResolver {
/***
用于提供异常处理的逻辑
*/
@Nullable
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}
3 自定义异常处理器
实现HandlerExceptionResolver 接口,自己注入spring容器。
之前讲过这种方式来处理异常:
@ControllerAdvice
public class ExceptionHandlerAdvice {
/****
* value属性:指定的是可以处理哪些异常
* 形参中的Exception e, 捕获到的异常
* 通过Model model 返回错误信息给页面
*/
@ExceptionHandler(value = {IllegalArgumentException.class})
public String errorHandler(Exception e, Model model){
model.addAttribute("error",e.getMessage());
// 返回错误页面
return "error";
}
}
现在改为这个:
package study.wyy.spring.anno.web.exceptionresolver;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author by wyaoyao
* @Description: 自定义异常处理解析器
* @Date 2021/2/15 7:58 下午
*/
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//1.创建返回值对象
ModelAndView mv = new ModelAndView();
//2.设置错误提示信息
if(ex instanceof IllegalArgumentException){
mv.addObject("errorMsg",ex.getMessage());
}else {
//系统异常
mv.addObject("errorMsg","服务器内部错误,请联系管理员!");
}
//3.设置结果视图名称
mv.setViewName("error");
//4.返回
return mv;
}
}
但是他俩有个区别
- ControllerAdvice这个方式,还可以处理控制器执行之前出现的异常
- HandlerExceptionResolver只能处理控制器执行以后的异常