iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Feign调用全局异常处理解决方案
  • 428
分享到

Feign调用全局异常处理解决方案

2024-04-02 19:04:59 428人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

异常信息形如: TestService#addRecord(ParamVO) failed and no fallback available.; 对于failed a

异常信息形如:

TestService#addRecord(ParamVO) failed and no fallback available.;

对于failed and no fallback available.这种异常信息,是因为项目开启了熔断:


feign.hystrix.enabled: true

当调用服务时抛出了异常,却没有定义fallback方法,就会抛出上述异常。由此引出了第一个解决方式。

解决方案:

自定义Feign解析器:


import com.alibaba.fastJSON.jsONException;
import com.alibaba.fastjson.JSONObject;
import com.crecgec.baseboot.jsoncore.exception.BaseException;
import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class FeignErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        try {
            // 这里直接拿到我们抛出的异常信息
            String message = Util.toString(response.body().asReader());
            try {
                JSONObject jsonObject = JSONObject.parseObject(message);
                return new BaseException(jsonObject.getString("resultMsg"), jsonObject.getInteger("resultCode"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (IOException ignored) {
        }
        return decode(methodKey, response);
    }
}

定义系统的异常类


public class BaseException extends RuntimeException {
    private int status ; 
    public int getStatus() {
        return status;
    }
 
    public void setStatus(int status) {
        this.status = status;
    }
 
    public BaseException() {
    }
 
    public BaseException(String message, int status) {
        super(message);
        this.status = status;
    }
 
    public BaseException(String message) {
        super(message);
    }
 
    public BaseException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public BaseException(Throwable cause) {
        super(cause);
    }
 
    public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

统一异常拦截转换对应的异常信息返回前端


public class ResultSet {
    
    private Integer resultCode;
    
    private String resultMsg;
    
    private Object data;
    public ResultSet() {
    }
    public ResultSet(Integer resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }
    public ResultSet(Integer resultCode, String resultMsg, Object data) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
        this.data = data;
    }
    public Integer getResultCode() {
        return resultCode;
    }
    public void setResultCode(Integer resultCode) {
        this.resultCode = resultCode;
    }
    public String getResultMsg() {
        return resultMsg;
    }
    public void setResultMsg(String resultMsg) {
        this.resultMsg = resultMsg;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}

全局异常类处理配置:


@ExceptionHandler(value = BaseException.class)
public ResultSet defaultErrorHandler(httpservletRequest req, HttpServletResponse resp, BaseException e) {
    ResultSet resultSet = new ResultSet();
    if (e.getStatus() == 400) {
        resultSet.setResultCode(-1);
        resultSet.setResultMsg(e.getMessage());
        resultSet.setData(null);
        resp.setStatus(400);
    } else {
        resp.setStatus(500);
        if(logger.isErrorEnabled()){
            logger.error("系统异常,请联系系统开发人员进行处理", e);
        }
        resultSet.setResultCode(-1);
        resultSet.setResultMsg(e.getMessage());
        resultSet.setData(null);
    }
    return resultSet;
}

这样就能完成了feign接收异常处理的自定义异常信息!

统一处理@FeignClient调用接口异常----原样抛出

第三方系统调用我方系统@FeignClient接口时报错

com.netflix.hystrix.exception.HystrixRuntimeException: WorkFlowTaskOperateService#processWorkFlowTaskSyncCallback(TaskProcessDTO) failed and no fallback available.

我方系统出现FeignException.

第三方调用者抛出的异常:HystrixRuntimeException

一检查我们系统确实没有指定fallback和configuration,并且调用方开启了feign.hystrix.enabled: true


@FeignClient(value = "taxplan-workflow")

修改方法:

第三方调用在Application.java添加处理Feign异常的全局处理方法


@Bean
public Feign.Builder feignBuilder() {
    return Feign.builder().requestInterceptor(new RequestInterceptor() {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            Map<String, String> customHeaders = WEBUtils.getCustomHeaders();
            customHeaders.forEach((k, v) -> {
                requestTemplate.header(k, v);
            });
        }
    }).errorDecoder(new CustomErrorDecoder());
}

这里使用了RequestInterceptor拦截器,可以定制请求头,如果不想定制,可以改为


return Feign.builder().errorDecoder(new CustomErrorDecoder());

实现ErrorDecoder接口,其中ExceptionCode是枚举类.


public Exception decode(String methodKey, Response response) {
        if (response.status() >= 400 && response.status() <= 499) {
            return new BaseBizException(ExceptionCode.CALL_INNER_ERROR, "Client error.httpStatusCode:" + response.status());
        } else {
            if (response.status() >= 500 && response.status() <= 599 && response.body() != null) {
                try {
                    String content = CharStreams.toString(new InputStreamReader(response.body().asInputStream(), StandardCharsets.UTF_8));
                    Map responseBody = (Map) JSONObject.parseObject(content, Map.class);
                    if (responseBody.containsKey("code")) {
                        return new BaseBizException(responseBody.get("code").toString(), Objects.toString(responseBody.get("msg")));
                    }
                } catch (Exception var5) {
                }
            }
 
            return new BaseBizException(ExceptionCode.CALL_INNER_ERROR);
        }
    }

ExceptionCode枚举类如下:可以自定义增加删除


public enum ExceptionCode {
    ILLEGAL_STATE(4001, "非法访问"),
    PARAM_REQUIRED(4002, "参数不能为空"),
    PARAM_FORMAT_ILLEGAL(4003, "参数格式错误"),
    REQUEST_DATA_DUPLICATION(4004, "重复请求"),
    REQUEST_DATA_ERROR(4005, "请求数据错误"),
    REQUEST_DATA_NOT_MATCH(4006, "请求数据不一致"),
    RECORD_NOT_EXIST(5001, "记录不存在"),
    RECORD_EXISTED(5002, "记录已存在"),
    RECORD_ILLEGAL_STATE(5003, "数据异常"),
    BALANCE_NOT_ENOUGH(5103, "余额不足"),
    CALL_INNER_ERROR(5800, "调用内部服务接口异常"),
    THIRD_PART_ERROR(5801, "调用第三方接口异常"),
    SYSTEM_ERROR(9999, "系统异常"); 
    public final int code;
    public final String defaultMessage; 
    private ExceptionCode(int code, String defaultMessage) {
        this.code = code;
        this.defaultMessage = defaultMessage;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Feign调用全局异常处理解决方案

本文链接: https://www.lsjlt.com/news/129012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Feign调用全局异常处理解决方案
    异常信息形如: TestService#addRecord(ParamVO) failed and no fallback available.; 对于failed a...
    99+
    2024-04-02
  • 解决Feign获取异常信息的处理方案
    目录Feign获取异常信息解决方案一、客户端接口指定熔断器处理工厂类二、ArticleFallBackFactory三、ArticleClientImplFeign中 fallbac...
    99+
    2024-04-02
  • SpringBoot全局异常处理方案分享
    目录一 业务场景二 全局系统异常类一)全局系统异常类二) 包装异常返回结果给前端,修改自定义异常三 返回案例一 业务场景 调用接口时需要对属性进行校验,比如属性长度,当属性为邮箱时校...
    99+
    2024-04-02
  • springboot框架的全局异常处理方案详解
    系统框架搭建的前期过程中,为了约束代码规范,我们会对一些通用功能做一些处理,比如声明一些系统公用错误类、封装通用返回结果、统一异常处理等,这样做的优势是团队开发过程中能够形成统一的代...
    99+
    2024-04-02
  • SpringBoot 全局异常处理——解决404/500
    SpringBoot 全局异常处理——解决404/500 SpringBoot要全局处理 Spring Boot 应用程序中的 HTTP 404 和 500 错误,您可以自定义一个异常处理器类,并使用...
    99+
    2023-09-28
    spring boot java 后端
  • Feign调用接口解决处理内部异常的问题
    问题描述: 当使用feign调用接口,出现400~500~的接口问题时。会出错feign:FeignException。(因为是错误,只能用catch Throwable,不可使用c...
    99+
    2024-04-02
  • Django与DRF结合的全局异常处理方案详解
    目录前言实现的目标DRF全局异常拦截的解决思路Django异常处理方案总结前言 Django 和 DRF(django rest framawork) 的结合在 python 后台中...
    99+
    2024-04-02
  • SpringBoot全局异常处理方式
    目录SpringBoot全局异常处理springboot全局异常处理——@ControllerAdvice+ExceptionHandler一、全局捕获异常后,返回json给浏览器二...
    99+
    2024-04-02
  • springboot全局异常处理详解
    一、单个controller范围的异常处理package com.xxx.secondboot.web;import org.springframework.web.bind.annotation.ExceptionHandler;impo...
    99+
    2023-05-31
    spring boot 全局异常
  • Vue实现全局异常处理的几种方案
    目录一、前端常见异常二、实现简单的全局异常处理三、Vue3 如何实现异常处理四、总结在开发组件库或者插件,经常会需要进行全局异常处理,从而实现:\ 全局统一处理异常;为开发...
    99+
    2024-04-02
  • ASP.NETCore全局异常处理
    一、前言 在程序设计中,我们会遇到各种各样的异常问题,一个好的异常处理解决方案能够帮助开发者快速的定位问题,也能够给用户更好的用户体验。那么我们在AspNetCore中该如何捕获和处...
    99+
    2024-04-02
  • Feign调用传输文件异常的解决
    1. Current request is not a multipart request feign接口参数使用 @RequestPart 而非 @RequestParam, 同时...
    99+
    2024-04-02
  • Django RestFramework 全局异常处理详解
    目录RESTframework定义的异常一、定义异常处理类二、注册DRF框架中默认的错误处理为自己定义的类总结REST framework定义的异常 APIException 所有异...
    99+
    2024-04-02
  • 如何使用Django与DRF实现全局异常处理方案
    小编给大家分享一下如何使用Django与DRF实现全局异常处理方案,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现的目标如果没有 DRF,我们只需要在 Djan...
    99+
    2023-06-29
  • Spring Boot全局异常处理解析
    本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下1、后台处理异常a、引入thymeleaf依赖<!-- thymeleaf模板插件 --><dependency> <groupId&...
    99+
    2023-05-31
    spring boot 异常处理
  • SpringCloud feign微服务调用之间的异常处理方式
    如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表。 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一、加上hy...
    99+
    2024-04-02
  • SpringBoot配置GlobalExceptionHandler全局异常处理器案例
    1. 创建全局异常处理器类GlobalExceptionHandler @ControllerAdvice: 定义统一的异常处理类,捕获 Controller 层抛出的异常。如果添加...
    99+
    2024-04-02
  • SpringBoot全局异常处理 | Java
    ⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言...
    99+
    2023-10-12
    java spring boot 后端
  • Java Springboot全局异常处理
    目录前言一、思路?二、步骤1.自定义接口:2.自定义错误枚举3.自定义异常类4.异常捕获5.在代码中抛异常总结前言 对于作为菜鸟程序员的我来说,经常在controller使用try-...
    99+
    2024-04-02
  • 详解Spring全局异常处理的三种方式
    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。 那...
    99+
    2023-05-31
    spring 异常 异常处
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作