通用异常处理感悟篇
一般在大型互联网项目中会使用到通用异常处理
通用步骤如下:
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()));
}
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。