SpringBoot:如何优雅地处理全局异常?

假如我们需要针对NullException(空指针异常,是Java程序员最痛恨的异常,没有之一)进行全局处理(如下所示)。

方案一:

@RestControllerAdvice
public class GlobalExceptionHandler {
        /**
     * 处理空指针的异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =NullPointerException.class)
    public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("发生空指针异常!原因是:",e);
        return ResponseUtil.error(ResponseCode.ERROR);
    }
}

或者自定义异常

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


@Data
@AllArgsConstructor
@Accessors(chain = true)
public class BizException extends RuntimeException {
    /**
     * 错误码
     */
    protected Integer errorCode;
    /**
     * 错误信息
     */
    protected String errorMsg;
}

显而易见,这个异常继承了RuntimeException,属于运行时异常,抱错能够会滚;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理自定义的业务异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = BizException.class)
    public BaseResponseFacade bizExceptionHandler(HttpServletRequest req, BizException e){
        log.error("发生业务异常!原因是:{}",e.getErrorMsg());
        return ResponseUtil.error(e.getErrorCode(),e.getErrorMsg());
    }

    /**
     * 处理空指针的异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =NullPointerException.class)
    public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("发生空指针异常!原因是:",e);
        return ResponseUtil.error(ResponseCode.ERROR);
    }

测试请求

@GetMapping("/test")
public BaseResponseFacade test(){
  if(true){
    throw new BizException(1,"error");
  }
  return ResponseUtil.success();
}

结果
地址栏请求,进入这个方法后,会抛出异常,此时全局异常生效,就会返回异常处理过后的信息

{“errorCode”:1,“errorMsg”:“error”,“data”:null}

方案二:

2.1定义1级继承类

//定义业务异常
public class TransException extend RuntimeExcepton{
	
	private static final lang serialVersionUID = 1L;
	
	private String rtnCode;

	private String rtnDesc;

	//get\set方法

	public TransException(String rntCode,String rtnMsg){
	super(rtnMsg);
	this.rtnCode  = rtnCode;
	this.rtnDesc = rtnMsg;
	}
}

y也可以定义二级异常类
public class TransSpecialException extend TransException {

	public TransSpecialException (String rntCode,String rtnMsg){
		super(rntCode,rtnMsg);
	}
}




2.2交易内部抛出,公共基类进行捕捉
throw new transException(“1234”,“1234”);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值