谷粒学苑项目-第一章统一异常处理-1.8
一、统一异常处理的概念
我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理
二、创建统一异常处理器
1. 统一异常处理器
在service-base中创建统一异常处理类GlobalExceptionHandler.java。
/** * 统一异常处理类 */ @RestControllerAdvice public class GlobalExceptionHandler { }
2.异常的分类
异常一般分为三类:全局异常Exception,特定异常(如除数为0),自定义异常(业务异常)
3. 统一处理全局异常
/** * 统一异常处理类 */ @RestControllerAdvice public class GlobalExceptionHandler { //全局异常,系统自带的异常会自动抛出 @ExceptionHandler(Exception.class) public Resault doException(Exception e){ e.printStackTrace(); return Resault.error().message("执行了全局异常"); } }
执行controller,触发异常
@ApiOperation("查找全部功能") @GetMapping("/findall") public Resault findAll(){ List<EduTeacher> list = eduTeacherService.list(); Integer.parseInt("100a"); return Resault.ok().data("items",list); }
自动抛出异常,并返回统一结果
{ "success": false, "code": 20001, "message": "执行了全局异常", "data": {} }
4. 统一处理特定异常
处理特定异常接口
/** * 统一异常处理类 */ @RestControllerAdvice public class GlobalExceptionHandler { //全局异常,系统自带的异常会自动抛出 @ExceptionHandler(Exception.class) public Resault doException(Exception e){ e.printStackTrace(); return Resault.error().message("执行了全局异常"); } //特定异常,如果是系统自带的会自动抛出 @ExceptionHandler(NumberFormatException.class) public Resault doException(NumberFormatException e){ e.printStackTrace(); return Resault.error().message("执行了特定异常-NumberFormatException"); } }
执行controller,触发异常
@ApiOperation("查找全部功能") @GetMapping("/findall") public Resault findAll(){ List<EduTeacher> list = eduTeacherService.list(); Integer.parseInt("100a"); return Resault.ok().data("items",list); }
自动抛出异常,并返回统一结果
{ "success": false, "code": 20001, "message": "执行了特定异常-NumberFormatException", "data": {} }
5. 统一处理自定义异常
第一步:自定义异常类,继承自RuntimeException
@Data @AllArgsConstructor @NoArgsConstructor public class BusinessException extends RuntimeException{ private Integer code; private String msg; }
第二步:处理自定义异常接口
/** * 统一异常处理类 */ @RestControllerAdvice public class GlobalExceptionHandler { //全局异常,系统自带的异常会自动抛出 @ExceptionHandler(Exception.class) public Resault doException(Exception e){ e.printStackTrace(); return Resault.error().message("执行了全局异常"); } //特定异常,如果是系统自带的会自动抛出 @ExceptionHandler(NumberFormatException.class) public Resault doException(NumberFormatException e){ e.printStackTrace(); return Resault.error().message("执行了特定异常-NumberFormatException"); } //自定义异常,系统不会自动抛出,需要自己throw new BusinessException @ExceptionHandler(BusinessException.class) public Resault doException(BusinessException e){ e.printStackTrace(); return Resault.error().code(e.getCode()).message(e.getMsg()); } }
第三步:执行controller,触发异常
@ApiOperation("查找全部功能") @GetMapping("/findall") public Resault findAll(){ List<EduTeacher> list = eduTeacherService.list(); try{ Integer.parseInt("100a"); }catch (Exception e){ throw new BusinessException(20001,"执行了自定义异常"); } return Resault.ok().data("items",list); }
自动抛出异常,并返回统一结果
{ "success": false, "code": 20001, "message": "执行了自定义异常", "data": {} }