# 自定义

# 自定义异常处理器

如果方法指定设置了降级的方法,那么是不会进入自定义异常的

  1. 实现 BlockExceptionHandler 接口并标注 @Component 注解加入 Spring 容器

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
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.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.PrintWriter;

@Component
public class CustomExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest req, HttpServletResponse res, BlockException e) throws Exception {
        res.setStatus(429);
        PrintWriter writer = res.getWriter();

        StringBuilder errMsgBuilder = new StringBuilder("Blocked by Sentinel - ");

        if (e instanceof FlowException) {
            errMsgBuilder.append("Flow Exception");
        } else if (e instanceof DegradeException) {
            errMsgBuilder.append("Degrade Exception");
        } else if (e instanceof SystemBlockException) {
            errMsgBuilder.append("System BlockException");
        } else if (e instanceof ParamFlowException) {
            errMsgBuilder.append("Param FlowException");
        } else if (e instanceof AuthorityException) {
            errMsgBuilder.append("Authority Exception");
            res.setStatus(401);
        }

        writer.print(errMsgBuilder.toString());
        writer.flush();
        writer.close();
    }
}
  1. 在控制台页面设置熔断或者其他

# 自定义错误跳转页面(前后端不分离)

  1. 在 resources/下新建 META-INF/resources/,并放入页面 自定义异常页面
  2. 实现 BlockExceptionHandler
@Component
public class CustomErrorViewHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest req, HttpServletResponse res, BlockException e) throws Exception {
        String page = "/CustomError.html";
        req.getRequestDispatcher(page).forward(req, res);

    }
}

# 重定向URL(前后端分离)

还是一样实现 BlockExceptionHandler 接口,只是直接同通过 response 的 sendRedirect 方法重定向

@Component
public class CustomErrorViewHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest req, HttpServletResponse res, BlockException e) throws Exception {
        res.sendRedirect("https://jd.com");
    }
}