前言:
两个同事
A同事:全局捕获后自定义,硬是不肯使用异常处理器
B同事:全局捕获后抛出固定内容,异常信息只打日志
虽然有些是人情世故,但这两种异常框架的用法让我十分难以苟同。
毕竟JAVA的异常框架很好用,好用到能把BUG抛到调用方,让调用方先过滤问题。
项目中良好的异常设计,能减少测试、调用、开发、联调的很多工作。
一、常用方式
新建exception包,配置异常处理器对象如下:
一个方法,代表对一类异常的捕获处理
ReturnResult 是通用响应封装
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerConfig {
/**
* 自定义全局异常
*
* @param ex 自定义全局异常
* @return 返回
*/
@ExceptionHandler(BaseException.class)
public ReturnResult handleBaseException(BaseException ex) {
ReturnResult result = ReturnResult.error(ex);
log.error("handle BaseException: {}", result);
return result;
}
/**
* 自定义 校验参数校验异常
*
* @param ex 异常
* @return 参数校验异常
*/
@ExceptionHandler(value = {ConstraintViolationException.class})
@ResponseBody
public ReturnResult handleConstraintViolationException(ConstraintViolationException ex) {
ReturnResult result = ReturnResult.error(new ParamException(ex.getMessage()));
log.error("handle ConstraintViolationException: {}", result);
return result;
}
/**
* 参数绑定异常
*
* @param ex 异常
* @return 参数校验异常
*/
@ExceptionHandler(value = {BindException.class})
@ResponseBody
public ReturnResult handleBindException(BindException ex) {
List<ObjectError> allErrors = ex.getBindingResult().getAllErrors();
List<String> msgList = new ArrayList<>();
for (ObjectError allError : allErrors) {
msgList.add(allError.getDefaultMessage());
}
ReturnResult result = ReturnResult.error(new ParamException(msgList + ""));
log.error("handle BindException : {}", result);
return result;
}
/**
* 全局异常 非自定义异常,不允许正常显示
*
* @param ex 全局异常
* @return 返回
*/
@ExceptionHandler(Exception.class)
public ReturnResult handleGlobeException(Exception ex) {
log.error("error not catch", ex);
ReturnResult result = new ReturnResult();
result.setCode(ReturnCodeEnum.FAIL.getValue());
result.setMsg(ReturnCodeEnum.FAIL.getMsg());
return result;
}
}
二、其它用法
- 缩小异常捕获范围(以包分割)