状态为 0 的 FeignException?

FeignException with status 0?

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

在 Postman 中,我得到 HTTP 状态 500。

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

根据证据,您的 Postman-based webapp 正在使用 Feign 尝试与其他服务对话。当 Feign 尝试连接到服务时,它会在连接尝试期间或等待响应期间超时。

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

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

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


更新

I need to process all exception message/status of my feign client. For that, i put a try/catch for FeignException. This exception is created by feign when readtimeout is over XXX time. I don't know how i can get the status 500 got by postman instead of 0.

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

您想要在响应不存在时从响应中获取 HTTP 状态。显然你无法得到不存在的东西。或者,在这种情况下,您希望假装 伪造 响应代码。显然不是。

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

因此,如果您想在 try / catch 中诊断/处理超时,您需要专门测试异常处理程序中的状态 == 0。那么你可以:

  • 将所有响应代码为零的情况视为未诊断错误。

  • 测试ex.getMessage()看它是否包含“超时”或“超时”或类似内容。 (请注意,测试异常消息的特定内容会使您的代码可能变得脆弱或依赖于平台。但这可能不是您关心的问题。)

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