SpringBoot全局异常处理

一、目的

        当客户端/前端向服务端发送一个请求后,这个请求并不是每次都能完全正确的处理,比如出现一些资源不存在、参数错误或者内部错误等信息的时候,就需要将异常反馈给客户端或者前端。那么这就需要程序有完整的异常处理机制。

        在 Java 中所有异常的基类都是 Throwable 延伸出来,但通常不使用 Throwable,在该基类延伸出来 ErrorException 两种异常,严格意义上讲 Error 不属于异常,而是错误,Exception 才是异常,两者有什么区别呢?

        错误:所谓错误就是应用发生错误的是就启动不起来,一般都是操作系统或者是 JVM 级别上发生的错误,一旦发生错误,我们是无法通过代码来进行处理的;

       异常: Exception 一般是我们可以通过代码来进行处理的,例如我们平时查询数据库没有找到某一条记录,就是一个典型的空异常,再比如我们进行计算的时候,分母为 0, 也会报一个异常。

       Error 在平常工作我们是不需要处理,重点就是 Exception,Exception 又分为两种,一种是 CheckedException 异常,另一种是 RuntimeException 异常;这两个异常的区别是 CheckedException 要求必须在代码中进行处理,如果不处理,程序连编译都无法通过;RuntimeException不要求强制进行处理,因为这个异常属于运行的异常,不一定在编译阶段就能发现。

二、实现

        SpringBoot中,@ControllerAdvice 即可开启全局异常处理,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用@ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

一、定义一个全局异常处理类


@RestControllerAdvice
public class GlobalExceptionAdvice {

    // 处理已知异常(自定义异常)
    @ExceptionHandler(NepException.class)
    public ResponseEntity handleNepException(NepException e) {
        return new ResponseEntity(400, "空指针异常" + e.getMessage(), "");
    }

    // 未知异常
    @ExceptionHandler(Exception.class)
    public ResponseEntity handleException(Exception e) {
        return new ResponseEntity(400, "未知异常" + e.getMessage(), "");
    }

}

二、返回体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseEntity {

    private Integer code;

    private String message;

    private Object data;
}

3、全局运行时异常拦截


@GetMapping("/aa")
public ResponseEntity aa(){
    double a = 1/0;
    return new ResponseEntity(200,"请求成功","");
}

@GetMapping("bb")
public ResponseEntity bb(){
    ResponseEntity responseEntity = null;
    try {
        responseEntity.getCode();
    }catch (NullPointerException nullPointerException){
        throw new NepException();
    }
    return new ResponseEntity(200,"请求成功","");
}

四、自定义异常类

public class NepException extends NullPointerException{

}

五、全局异常返回

SpringBoot全局异常处理_第1张图片

SpringBoot全局异常处理_第2张图片

四、总结

整个流程就是全局异常拦截,当然不止这一行几行代码,很多地方都可以根据我们自身实际业务情况以此为基础进一步丰富,比如返回数据可以改成跳转某一个具体的页面。这样的出场方式是不是都很优雅。总的来说,我们可以根据自身业务和实际需求对异常进行全局处理。

你可能感兴趣的:(java,jvm,开发语言)