Springboot统一异常处理

介绍

本篇介绍Springboot统一异常处理,自定义异常,前后端交互的时候我们可以进行全局异常catch。这样便于在系统出现错误的时候,我们方便排查错误。

统一结果与自定义错误枚举类

package com.elite.springboot.common;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 统一结果
 */
@Accessors(chain=true)
@Data
public class R {
    //请求返回的代码
    private Integer code;
    //请求的信息
    private String msg;
    //数据
    private Object data;

    //成功
    public static R ok(Object data){
        return new R().setCode(200).setMsg("成功").setData(data);
    }
    //成功
    public static R ok(Integer code,String msg,Object data){
        return new R().setCode(code).setMsg(msg).setData(data);
    }
    //失败
    public static R fail(){
        return new R().setCode(400).setMsg("请求失败!");
    }
    //失败
    public static R fail(Integer code,String msg){
        return new R().setCode(code).setMsg(msg).setData(null);
    }
}

错误枚举

package com.elite.springboot.common;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 统一错误枚举类
 */

@Getter
@AllArgsConstructor //全参数构造器
public enum ErrorEnum {
    SUCCESS(200,"请求成功"),
    FAIL(400,"请求错误"),
    SERVERERROR(500,"服务器内部错误"),
    PASSWORDERROR(10001,"密码错误"),
    PARAMETERERROE(10002,"请求参数错误"),
    NPERROR(10003,"空指针异常"),
    DIVERROR(10004,"除数异常"),
    MYEXCEPTION(10005,"自定义异常")
    // ....等等
     ;
    private Integer code;
    private String message;
}

全局异常处理

全局异常我们需要使用注解@ControllerAdvice,@ExceptionHandler指定异常的类型。

package com.elite.springboot.exception;

import com.elite.springboot.common.ErrorEnum;
import com.elite.springboot.common.R;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 我们定义一个全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandle {
    //通用的异常处理
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R commonHandle(Exception e){
        e.printStackTrace();
        return R.fail(ErrorEnum.FAIL.getCode(),ErrorEnum.FAIL.getMessage());
    }
    //空指针异常
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public R commonHandle(NullPointerException e){
        e.printStackTrace();
        return R.fail(ErrorEnum.NPERROR.getCode(),ErrorEnum.NPERROR.getMessage());
    }
    //空指针异常
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public R commonHandle(ArithmeticException e){
        e.printStackTrace();
        return R.fail(ErrorEnum.DIVERROR.getCode(),ErrorEnum.DIVERROR.getMessage());
    }
    //自定义异常
    //空指针异常
    @ExceptionHandler(MyException.class)
    @ResponseBody
    public R commonHandle(MyException e){
        e.printStackTrace();
        return R.fail(ErrorEnum.MYEXCEPTION.getCode(),ErrorEnum.MYEXCEPTION.getMessage());
    }
}

自定义异常

自定义异常可以继承Exception或者运行时异常RuntimeException,重写异常的方法。

package com.elite.springboot.exception;

public class MyException extends RuntimeException{

    //可以在内部进行处理抛出自定义异常错误信息
}

测试

可以看到我们测试代码里边没有加try catch代码块,有异常自动会被全局异常拦截返回错误信息。

package com.elite.springboot.controller;

import com.elite.springboot.common.ErrorEnum;
import com.elite.springboot.common.R;
import com.elite.springboot.exception.MyException;
import org.springframework.web.bind.annotation.*;

/**
 * 测试异常类controller
 */
@RequestMapping
@RestController
public class ExceptionController {


    //空指针异常
    @GetMapping("/exception1")
    public R test1(){
        String s = null;
        boolean equals = s.equals("");
        return R.ok(null);
    }
    //运算异常
    @GetMapping("/exception2")
    public R test2(){
        int i = 5/0 ;
        return R.ok(null);
    }
}

测试结果

http://localhost:8811/exception1

{"code":10003,"msg":"空指针异常","data":null}

http://localhost:8811/exception2

{"code":10004,"msg":"除数异常","data":null}

你可能感兴趣的:(spring,boot,java,spring)