设置自定义异常处理器

jinini利用拦截器实现

       1.创建异常实体,继承RuntimeException

public class MyCustomException extends RuntimeException {

    private ResponseStatusEnum responseStatusEnum;

    public MyCustomException(ResponseStatusEnum responseStatusEnum) {
        super("异常状态码为:" + responseStatusEnum.status() + ";" + "具体异常信息为:" + responseStatusEnum.msg());
        this.responseStatusEnum = responseStatusEnum;
    }

    public ResponseStatusEnum getResponseStatusEnum() {
        return responseStatusEnum;
    }

    public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
        this.responseStatusEnum = responseStatusEnum;
    }
}

2.创建自定义异常捕捉器

@ControllerAdvice:切面
@ExceptionHandler(MyCustomException.class):只捕捉这个异常
GraceJSONResult:已定义返回类
@ControllerAdvice
public class GraceExceptionHandler {

    @ExceptionHandler(MyCustomException.class)
    @ResponseBody
    public GraceJSONResult returnMyException(MyCustomException e) {
        e.printStackTrace();
        return GraceJSONResult.exception(e.getResponseStatusEnum());
    }
}

3.创建拦截器

        1.实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion;

        2.preHandle:拦截请求,访问controller之前

        3.postHandle:在请求访问到controller之后,渲染视图之前

        4.afterCompletion:在请求访问到controller之后,渲染视图之后

只要上面三个方法中返回false则会被拦截,返回true则通过

public class PassportInterceptor implements HandlerInterceptor {

    @Autowired
    protected RedisOperator redisOperator;

    public static final String MOBILE_SMSCODE = "mobile:smscode:";

    /**
     * 拦截请求,访问controller之前
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String userIP = IPUtil.getRequestIp(request);

        if (redisOperator.keyIsExist(MOBILE_SMSCODE + userIP)) {

            GraceException.display(ResponseStatusEnum.SMS_NEED_WAIT_ERROR);

            return false;
        }

        return true;
    }

    /**
     * 在请求反问道controller之后,渲染视图之前
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 在请求反问道controller之后,渲染视图之后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

4.当拦截器拦截到时,使用GraceException优雅得抛出异常,被上面的自定义异常捕捉器捕获,实现自定义异常拦截处理

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String userIP = IPUtil.getRequestIp(request);

        if (redisOperator.keyIsExist(MOBILE_SMSCODE + userIP)) {

            GraceException.display(ResponseStatusEnum.SMS_NEED_WAIT_ERROR);

            return false;
        }

        return true;
    }

 把拦截器配置放进bean容器并设置拦截路径:

 拦截到异常抛出

public class GraceException {

    public static void display(ResponseStatusEnum responseStatusEnum) {
        throw new MyCustomException(responseStatusEnum);
    }
}

5. 重点:

        在springBoot启动类中需要添加@ComponentScan()或@ComponentScans(),负责扫描拦截对应的包前缀下面的异常抛出,否则无法拦截

@SpringBootApplication
@MapperScan(basePackages = "com.fox.user.mapper")
@ComponentScan("com.fox") // 负责扫这个包前缀
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

"OpenFeign Read Timed Out" 异常通常表示当使用 OpenFeign 进行远程服务调用时,由于网络延迟或其他原因请求超时了。OpenFeign 是一个基于 Java 的 HTTP 客户端库,它默认的行为是在超时后抛出 `TimeoutException`。 如果你遇到了这个异常并且发现它并没有按照你的预期通过自定义异常处理器处理,可能是以下几个原因: 1. **未配置全局异常处理器**:你需要在你的 Feign Client 或者全局层面上设置一个 `GlobalResponseHandler`,用于捕获并处理响应相关的错误,包括超时。例如,在 Feign.Builder 中添加 `handler(new GlobalResponseHandler())`。 ```java Feign.builder() .globalResponseHandler(new GlobalResponseHandler() { @Override public void handleResponse(Call call, Response response) { if (response.status() == 408 || response.status() == 504) { // 检查是否是超时错误 CustomTimeoutException customEx = new CustomTimeoutException(); throw customEx; } // 其他处理逻辑... } }) .target(YourApiInterface.class, "http://your-api-url"); ``` 2. **自定义异常处理器未覆盖**:确认你的自定义异常处理器是否正确地注册并覆盖了 OpenFeign 默认的异常处理。如果只处理特定类型的异常,而不包括读取超时这类通用异常,那么超时会继续抛出原生的 `TimeoutException`。 3. **超时时间设置**:检查你的超时时间和连接池设置。如果超时时间过短,也可能导致读取超时异常直接抛出。 如果你遇到这个问题,请确保上述步骤都已正确执行,并根据实际情况调整异常处理策略。如果你需要进一步帮助,可以提供更多的上下文信息或者具体的代码片段以便分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值