1、目的
- 全局统一管理异常,无需在每个controller中都try-catch
- 即使报错那么也可以返回指定前端可以解析的格式
2、处理方式
2.1全局异常处理
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends SimpleMappingExceptionResolver {
// 全局异常
@ExceptionHandler(Exception.class)
@ResponseBody
public PlatformResult<?> handleException(Exception e) {
return PlatformResult.failure(e.getMessage());
}
}
注意:
1、@RestControllerAdvice:代表开启Aop,必须要有
2、@ExceptionHandler(Exception.class):代表捕获的异常,这里是全局异常所以用【Exception】,代表什么异常都可以捕获
3、然后就是在方法体写,触发这个异常想要的效果
2.2特定异常处理
注意:
1、与全局异常基本一致,只不过是将注解@ExceptionHandler中的异常类型换成其他指定的类型
2、这里需注意特定异常处理有着更高的优先级,能走特定异常处理的一定走特定异常处理,走不了的才去找全局
2.3自定义异常处理
- 首先定义一个自定义异常类
/**
* 自定义token异常
*/
@Data
@NoArgsConstructor// 无参构造
@AllArgsConstructor// 有参构造
public class TokenException extends RuntimeException{
private Integer code;//状态码
private String msg;// 状态信息
}
- 在需要的地方抛出指定异常,可以输入指定的信息,比如状态码和信息提示。
- 在全局异常类中捕获这个指定的异常,其实这一步同特定异常处理差不多,只不过将捕获的异常换成你自定义的。并在方法体中进行你的处理
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends SimpleMappingExceptionResolver {
// 全局异常
@ExceptionHandler(Exception.class)
@ResponseBody
public PlatformResult<?> handleException(Exception e) {
return PlatformResult.failure(e.getMessage());
}
// 自定义token异常
@ExceptionHandler(TokenException.class)
@ResponseBody
public ResponseEntity<PlatformResult> handleOpdRuntimeException(TokenException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED.value()).body(PlatformResult.failure(e.getMsg()).setCode(e.getCode()));
}
}