谷粒学苑项目-第一章统一异常处理-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": {} }
