spring boot 全局异常处理可以通过实现 @exceptionhandler 方法捕获 com.alibaba.csp.sentinel.slots.block.blockexception 及其子类,从而拦截 sentinel 限流、降级等规则触发的异常。具体做法是在全局异常处理器中定义一个专门处理 blockexception 的方法,返回自定义的 json 响应或错误码,这样就能在业务代码无感知的情况下统一处理流量控制结果。

如何区分 Sentinel 的不同规则类型
通过检查 BlockException 的具体子类实例,可以区分是限流(FlowException)、热点参数限流(ParamFlowException)还是系统保护(SystemBlockException)。在异常处理方法中,使用 instanceof 判断异常类型,并提取对应的规则信息(如资源名、阈值),以便在日志记录或前端提示中提供更有针对性的反馈。

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.param.ParamFlowException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BlockException.class)
public String handleBlockException(BlockException e) {
if (e instanceof FlowException) {
return "限流触发: " + ((FlowException) e).getRule().getResource();
} else if (e instanceof ParamFlowException) {
return "热点限流触发";
} else if (e instanceof DegradeException) {
return "降级触发";
}
return "Sentinel 规则拦截";
}
}
如何处理非 BlockException 的其他异常
在全局异常处理器中,除了处理 BlockException,还需要定义其他 @ExceptionHandler 方法来处理常见的运行时异常(如 NullPointerException)或业务异常。这些处理器应独立于 BlockException 的处理逻辑,确保非 Sentinel 相关的错误也能被正确捕获和响应,避免混淆不同来源的错误状态。

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleGeneralException(Exception e) {
return "系统内部错误: " + e.getMessage();
}
@ExceptionHandler(NullPointerException.class)
public String handleNullPointer(NullPointerException e) {
return "空指针异常: " + e.getMessage();
}
}
当 Sentinel 规则未配置时默认行为是什么
如果某个资源没有配置任何 Sentinel 规则,BlockException 不会被抛出,请求会正常执行。此时全局异常处理器中的 @ExceptionHandler(BlockException.class) 方法不会生效,请求将按正常流程返回结果。这意味着 Sentinel 仅在规则匹配时才介入,未配置规则的资源不受影响,保持原有的业务逻辑执行路径。


















