目录
- 一.全局异常捕获
- 1.1 全局捕获
- 1.2 基础异常
- 1.3 业务参数异常
- 二.验证
- 2.1 定义实体类
- 2.2 定义接口
- 总结
现在比较常用的方式是给前端返回jsON,但是有些时候程序出现一些异常,导致前端页面报错不是很友好,所以就需要对项目进行全局的异常捕获,返回给前端固定的格式,进行友好的处理!
话不多说,开始写代码
一.全局异常捕获
1.1 全局捕获
@Slf4j @RestControllerAdvice(annotations = {RestController.class}) public class BaseExceptionHandler { /** * <p> * 全局Base异常处理 * </p> * @version 1.0.0 * @author Dylan * @since 2020/2/27 * @param e */ @ExceptionHandler({BaseException.class,BusinessException.class}) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public R customExceptionHandler(BaseException e) { sysLog(); log.info("自定义异常 ---> {}",e); return R.error(e.getCode(),e.getMsg()); } /** * <p> * 其他类型的异常处理 * </p> * @version 1.0.0 * @author Dylan * @since 2020/2/27 * @param e */ @Exce编程ptionHandler({Exception.class}) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public R customExceptionHandler(Exception e) { sysLog(); log.info("未知的运行异常 ---> ",e); return R.error(); } /** * <p> * 参数异常处理 * </p> * @version 1.0.0 * @author Dylan-haiji * @since 2020/2/28 * @param exception */ @ExceptionHandler(value= MethodArgumentNotValidException.class) public R methodNotValidHandler(MethodArgumentNotValidException exception) { sysLog(); log.info("参数异常 ---> ",exception); List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors(); return R.error(fieldErrors.get(0).getDefaultMessage()); } /** * <http://www.devze.com;p> * 统一日志输出 * </p> * @version 1.0.0 * @author Dylan-haiji * @since 2020/2/28 * @param * @return void */ private void sysLog(){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String requestUri = request.getRequestURI(); lophpg.info("异常 method ---> {}",request.getMethod()); log.info("异常 requestURI ---> {}",requestUri); } }
1.2 基础异常
public class BaseException extends RuntimeException{ private Integer code; private String msg; public BaseException(Integer code, String msg){ this.code = code; this.msg = msg; } public BaseException( String msg){ this.code = 500; this.msg = msg; } }
1.3 业务参数异常
public class BusinessException extends BaseException { public BusinessException(Integer code, String msg) { super(code, msg); } public BusinessException() { super(ConstantUtils.BUSINESS_DATA); } public BusinessException(String msg) { super(msg); } }
二.验证
通过上面的配置,我们可以进行全局的异常捕获,接下来我们以参数验证为例进行验证是否可用!
2.1 定义实体类
public class Demo implements Serializable { @NotBlank(message = "请选择时间") private String endDate; @NotB编程客栈lank(message = "请选择范围类型") private String value; }
2.2 定义接口
@PostMapping(value = "list") public R getOve编程客栈rView(@RequestBody @Valid Demo demo){ return R.ok(); }
这是我们调用接口,直传一个参数!达到了我们的预期效果
当然我们处理业务的时候也可进行异常的抛出,这样也会进行全局的捕获!
这样的接口返回就非常的友好了!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论