电池焦虑:
对于异常,生活中也是面对生活不确定性的考验,比如我们手机在快没电的时候,我们会焦急的给它供电,防止断电影响我们的工作和生活体验, 一个产品或者在项目在实际的运行中,随之环境和场景的变化,出现的问题也是多种多样的,比如我造一辆车,我既要考虑,高温,车内的温度,助于散热,防止安全事故发生,或者采用报警提示的方式,这就是一个对待异常处理的方式。
如果解决不了,就抛出来,这也是我学异常之前,老师交给我们的第一句话,第二句可就是自己改了,我们继续开始,这期的主要是关于从 springboot 出发探究一下底层的异常机制:
异常
对于异常,指的是在项目编译或者运行过程中所出现的异常情况,比如参数转换,类型异常,数组越界,空指针等多个异常。
这次用的版本是 springboot 2.2.13GA 版本
springboot的官方文档地址
在 springBoot Features 中 (特性)中找到
springboot的关于errorHandler文档地址
错误处理
springboot 默认有错误的机制,分为两种全局的异常处理,定制的异常处理;
全局异常处理:
其实在设计框架的时候,就已经配置了关于运行过程中的异常问题,
全局异常处理原理:
利用的是 @ControllerAdvice ,表示的是我们定义了一个控制器增强类,当其他任何控制器发送异常的时候,且服务 @ExceptionHandler 注解中制定的异常类时候,当前的请求都会被拦截到我们定义的此控制器类中
本质上时: 控制器增强器捕获,具体异常拦截做匹配
创建统一异常处理类
GlobalExceptionHandler
测试类:
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 参数解析失败
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(HttpMessageNotReadableException.class)
public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
log.error("参数解析失败", ex);
return Result.failCode202("参数解析失败");
}
/**
* 参数验证异常
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
log.error("参数验证异常", ex);
BindingResult result = ex.getBindingResult();
FieldError error = result.getFieldError();
String field = error.getField();
String code = error.getDefaultMessage();
String message = String.format("%s:%s", field, code);
return Result.failCode202("参数验证异常:" + message);
}
/**
* 参数验证异常
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(ValidationException.class)
public Result handleValidationException(ValidationException ex) {
log.error("参数验证异常", ex);
return Result.failCode202("参数验证异常");
}
/**
* 不支持当前请求方法
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException ex) {
log.error("不支持当前请求方法", ex);
return Result.failCode202("不支持当前请求方法");
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(UnauthorizedException.class)
public Result handle401() {
return Result.failCode403("权限不足");
}
/**
* 业务处理异常
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(UospException.class)
public Result handleUospException(UospException ex) {
log.error("业务处理异常", ex);
return Result.failCode202(ex.getMessage());
}
/**
* 捕捉其他所有异常
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
public Result globalException(Throwable ex) {
log.error("异常信息", ex);
return Result.fail(HttpConstants.STATUS_500, "系统异常");
}
}
复制代码
总结
对于全局的异常,根据异常控制器增强的注解, 然后根据定制化的区分异常类型,从而做到匹配化的触发定制的异常处理,其中还需要注意的一点是,关于
@ExceptionHandler(MyException.class)
复制代码
今天的分享就到这里了,期待下次关于自定义 springboot 的异常统一处理,是利用 @AbstractErrorController,底层还是这个类
我是卢卡,晚安了,记得点赞再走哦。
评论