FeignException的状态为0?

问题描述

由于超时问题,我收到状态为0而不是HTTP 500或504的FeignException(RetryableException)。

enter image description here

在邮递员中,我的HTTP状态为500。

enter image description here

为什么创建FeignException的状态为0?

解决方法

基于证据,您基于Postman的Web应用程序正在使用Feign尝试与其他服务进行对话。当Feign尝试连接到服务时,它会在尝试连接或等待响应时超时。

无论哪种情况,读取超时都意味着Feign无法获得HTTP响应。由于状态代码来自该响应,因此没有HTTP状态代码可进入FeignException

您的Postman应用程序代码显然没有处理FeignException,因此它正在传播到Postman堆栈中,该堆栈将其(正确地)转换为HTTP 500(内部错误)。

简而言之,Feign不会传递HTTP状态代码,因为它没有得到一个。 (并且没有HTTP状态代码表示“请求超时”。)


更新

我需要处理假冒客户的所有异常消息/状态。为此,我对FeignException进行了尝试/捕获。当readtimeout超过XXX时间时,伪装会创建此异常。我不知道如何获得邮递员获得的状态500,而不是0。

我认为您正在尝试解决错误的问题。

您希望在响应不存在时从响应获取HTTP状态。显然,您无法得到不存在的东西。另外,在这种情况下,您希望伪装伪造。显然不是。

并且正如我上面所解释的,Postman给出的500错误不是您假装请求的响应代码。这是Postman为您的Web应用生成 的响应代码。在超时的情况下,您的代码允许FeignException传播是一个“内部错误”!

因此,如果您想在try / catch中诊断/处理超时,则需要专门测试异常处理程序中的status == 0。然后您可以:

  • 处理所有响应代码为零的情况,作为无法诊断的错误。

  • 测试ex.getMessage()以查看其是否包含“超时”或“超时”或类似内容。 (请注意,测试异常消息的特定内容可能会使您的代码易碎或依赖于平台。但这对您而言可能不是问题。)

  • 测试ex.getCause(),查看原因异常是否表明超时,“连接被拒绝”或其他原因。