个人见解
@ControllerAdvice
+ @ExceptionHandler
是捕获异常进行处理,如果在方法内再次抛出异常,则会进入/error路径。
ErrorController
相当于重定向到/error路径,然后对这个路径进行处理。
注:该方法无法处理未进入Controller的异常,比如404和Filter中的异常
1、@ControllerAdvice
的实现
@ControllerAdvice
可以根据不同的异常做出不同的反馈,如果不需要可以直接用ErrorController来处理所有异常。
@ControllerAdvice
@Slf4j //lombok中的日志注解
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) //不可预知的异常可以直接用Exception捕获
public String exceptionHandler(HttpServletResponse response, Exception ex){
log.error(ex.getMessage());
//返回视图
return "error";
}
@ExceptionHandler(NullPointerException.class) //可预知的异常可以单独处理,支持自定义异常。
@ResponseBody
public ResultDTO nullPointerException(HttpServletResponse response){
//返回json
return ResultUtil.error("空指针");
}
}
2、无法被@ExceptionHandler
捕获的异常可以由ErrorController处理
@Controller
public class CustomExceptionHandler implements ErrorController{
@Autowired
private ErrorAttributes errorAttributes;
/**
* 默认错误路径
*/
private static final String ERROR_PATH = "/error";
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@RequestMapping(ERROR_PATH)
public String error(HttpServletRequest request, HttpServletResponse response) {
//响应状态404 406 500这类
int status = response.getStatus();
//获取异常信息
ServletWebRequest servletWebRequest = new ServletWebRequest(request);
Map<String, Object> errorAttributes = this.errorAttributes.getErrorAttributes(servletWebRequest, true);
//返回视图
return "error2";
}
}
捕获到的404异常
捕获到的RuntimeException