SpringBoot全局异常处理

实现全局异常处理

/**
 * @Author: CQ
 * @Date: 2020/9/3 9:22
 * <P> 全局异常的捕获处理</P>
 */

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(ReqFailedException.class)
    public ResponseEntity<String> handlerRunException(HttpServletRequest request, RuntimeException ex){
        log.error("", ex);
        log.error("请求地址:" + request.getRequestURL());
        log.error("请求参数: " + JsonUtils.toString(request.getParameterMap()));
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}
  • @RestControllerAdvice

    • 这个注解主要是针对Controller层中@RestController注解,如果你Controller层中使用的是@Controller注解,那么相对的全局异常处理是@ControllerAdvice
      
    • basePackages:可以指定某些包下面的Controller,如果不指定就是处理整个项目的Controller异常
      
    • 另外一点就是这个全局异常处理器是针对Controller层异常的处理,也就是说所有Service层的异常需要抛到Controller层
      
  • @ExceptionHandler

    • 对统一的异常类型进行捕获,针对特定的异常,要进行特定的处理,在代码中处理的是ReqFailedException,所有在Controller层中抛出ReqFailedException异常的都会再这里处理,但是如果直接写ExceptionHandler(Exception.class),就很让很多潜在的bug也被处理从而不暴露出来.但是有的bug是的确要让服务器停止运行修复的,所以要针对抛出的异常进行单独的自定义异常处理
      
    • 另外注意的就是在捕获异常之后,会根据在这里定义的异常进行操作,如果没有定义此异常,那么就去寻找该异常的父级, 如果父级没有就会去找父级的父级
      我在这里定义的是ReqFailedException,ReqFailedException继承RuntimeException,RuntimeException又继承Exception,也就是说Controller层抛出ReqFailedException后,会去找我定义ReqFailedException,如果找不到就会去找RuntimeException,RuntimeException找不到就会去找Exception,
      

自定义异常

/**
 * @Author: CQ
 * @Date: 2020/8/31 18:03
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ReqFailedException extends RuntimeException {
    
    // 是否成功
    private boolean success;
    // 提示信息
    private String msg;
    // 返回状态码
    private int status;

    public ReqFailedException(BizCode bizCode) {
        super(bizCode.getDesc());
        this.status = bizCode.getCode();
        this.msg = bizCode.getDesc();
        this.success = false;
    }

    public ReqFailedException(String msg) {
        super(msg);
        this.status = BizCode.REQUEST_FAILED.getCode();
        this.msg = msg;
        this.success = false;
    }
}

Controller

/**
 * @author CQO
 * @since 2023/03/12 13:53
 */
@RequestMapping("logAspect")
@RestController
public class MySystemLogAspectController {


    @PostMapping("test")
    public void MySystemLogAspectControllerTest){

        System.out.println("ow");

        throw new ReqFailedException("自定义异常处理");

    }
}

测试结果

posted @ 2023-03-14 16:15  unknown-n2  阅读(58)  评论(0编辑  收藏  举报