21.springboot的错误处理
用法:使用模板引擎进行处理
在templates新增error文件夹如图:
定制错误解析逻辑
一:第一种方式:(@ControllerAdvice和@ExceptionHandler处理全局异常;底层是ExceptionHandlerExceptionResource支持的)
重点1:@ControllerAdvice标签标定当前类处理异常
@ControllerAdvice
@Slf4j
public class GilobalExceptionHandler {
//重点2: @ExceptionHandle表示当前方法可以处理哪些异常,传入数组
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
//重点4:传入参数Exception e,来接受异常!
public String handlerAdvice(Exception e){
//重点3:最后返回的跟springboot的普通controller一致,返回string(表示跳转地址),也可以返回ModelAndView(存入数据,在页面上调用)
log.error("异常是:{}",e);
return "error/5xx";
}
}
二:第二种方式(@ResponseStatus+自定义异常;底层是ResponseStatusExceprtionResoulver,把responseStatus注解的信息组装成ModelAndView返回)
1.重点1:@ResponseStatus指定状态码和对应的错误信息,底层会将其放入到modelAndView中,message<===>reason
@ResponseStatus(value = HttpStatus.BAD_REQUEST,reason = "用户数太多了")
public class UserTooManyException extends RuntimeException{
public UserTooManyException() {
}
public UserTooManyException(String message) {
super(message);
}
}
其他地方调用:
@Controller
public class ThymealfController {
@GetMapping("/hello")
public String getThymealf(@RequestParam("aa") int aa ){
if(aa==3){
重点2:抛出自定义异常好!
throw new UserTooManyException();
}
return "/myHtml/success";
}
}
三:自定义异常解析器:
样例代码如下:
/**
* 自定义的异常解析器
*/
重点1:@Order设置自定义异常解析的优先级,数字越小优先级越高,
因为springboot底层也有其他的异常解析规则,默认自定义异常解析规则排在最后,如果异常被前面的异常解析规则捕获到,就不会轮到自定义的异常解析规则,
所以此处将自定义的异常解析规则调制最高标准
@Order(value = Ordered.HIGHEST_PRECEDENCE)
@Component
重点2:自定义异常解析规则实现HandlerExceptionResolver 类
public class WmdCustomerHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
try {
重点3:调用response.sendError方法时,error请求会转给controler(里面包含了错误信息和状态码,最终去那个页面:ErrorViewResolver会解析状态码,然后去error文件夹下找对应的错误页)
response.sendError(511, "吴孟达自定义异常!");
} catch (IOException e) {
e.printStackTrace();
}
return new ModelAndView();
}
}