一般在大型互联网项目中会使用到通用异常处理

通用步骤如下:

1.首先上来定义一个异常枚举类.里面定义异常信息,譬如:
@NoArgsConstructor
@AllArgsConstructor
public enum ExceptionEnum {
    PRICE_CANNOT_BE_NULL(400, "价格不能为空!");  //如果后续异常直接在后面添加接口。
    ;
    private int value;
    private String msg;

    public int value() {
        return this.value;
    }

    public String msg() {
        return this.msg;
    }
}
2.定义自己的异常返回过来的格式ExceptionResult,这是一个类,然后这类的构造函数是带参数构造函数,参数是异常枚举类对对象,然后把枚举类中定义的异常信息,如 value异常编码 msg 异常信息 ,赋值给返回到里面的参数,然后这些参数都是返回到用户,给用户看的 如下:
@Data
public class ExceptionResult {
    private int status;
    private String msg;
    private long timestamp;

    public ExceptionResult(ExceptionEnum em){
        this.status = em.value();
        this.msg = em.msg();
        this.timestamp = System.currentTimeMillis();
    }
}
3.定义异常类 例如lyException
这个异常类的构造函数也是一个带参数的构造函数,参数是异常枚举类,ExceptionEnum,并且需要集成RuntimeException
如下:
@Getter
public class LyException extends RuntimeException{

    private ExceptionEnum exceptionEnum;

    public LyException(ExceptionEnum exceptionEnum) {
        this.exceptionEnum = exceptionEnum;
    }
}
4.
如果是在controller层抛出异常,throws new LyException(ExceptionEnum.自定义的具体异常)
如下:
@PostMapping("item")
public ResponseEntity<Item> saveItem(Item item){
    if(item.getPrice() == null){
        //把异常抛出来,这里是把返回的信息作为异常处理了
        throw new LyException(ExceptionEnum.PRICE_CANNOT_BE_NULL);
    }
    Item result = itemService.saveItem(item);
    return ResponseEntity.ok(result);
}
5.controller层的拦截器就可以拦截从controller层抛出的异常,然后就可以获取到异常对象了 就是lyException的对象,然后又因为这个lyException这个对象中含有定义的异常枚举类的信息...,如下:
@ControllerAdvice
public class BasicExceptionHandler {

    @ExceptionHandler(LyException.class)
    public ResponseEntity<ExceptionResult> handleException(LyException e) {
        return ResponseEntity.status(e.getExceptionEnum().value())
                .body(new ExceptionResult(e.getExceptionEnum()));
    }
}