You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby(非Rails)环境下Savon处理Timeout::Error的方式咨询

嘿,刚好我之前折腾过Savon的错误处理逻辑,这个问题我能给你讲清楚!

关于Savon处理Timeout::Error的说明

首先明确一个核心结论:Savon不会把Timeout::Error包装成Savon::HTTPError或者Savon::SOAPFault,它会直接抛出底层的超时异常(通常是Net::ReadTimeout或者标准库的Timeout::Error,具体取决于你的Ruby版本和Net::HTTP的实现)。

为啥会这样?得先分清这几个错误的场景:

  • Savon::HTTPError:仅在HTTP请求返回非2xx状态码时才会触发——比如服务器返回404、500这类HTTP层面的错误响应,这时候请求已经完成,只是状态码不符合预期。
  • Savon::SOAPFault:是当服务器返回了合法的SOAP响应,但响应里包含SOAP协议定义的Fault节点时抛出的,属于服务端在SOAP业务逻辑内返回的错误。
  • 而超时错误(不管是连接超时还是读取超时)属于网络层面的异常——请求要么连不上服务器,要么发出去后迟迟收不到响应,根本没走到“获取HTTP响应”或者“解析SOAP内容”的阶段,所以Savon不会把这类异常包装成自己的错误类型,而是直接抛出底层Ruby标准库的异常。

给你个实际的捕获示例:

如果要处理超时情况,直接捕获对应的异常就行:

require 'savon'

# 初始化Savon客户端
client = Savon.client(wsdl: '你的WSDL地址')

begin
  # 调用SOAP接口
  response = client.call(:你的SOAP动作名称)
rescue Net::ReadTimeout, Timeout::Error => e
  puts "糟了,请求超时了:#{e.message}"
  # 这里可以加重试逻辑或者其他错误处理
rescue Savon::HTTPError => e
  puts "HTTP层面出错了:#{e.message}"
rescue Savon::SOAPFault => e
  puts "SOAP服务端返回业务错误:#{e.message}"
end

另外补充个小技巧:如果要自定义超时时间,可以在初始化客户端时配置:

client = Savon.client(
  wsdl: '你的WSDL地址',
  open_timeout: 10, # 连接超时时间,单位秒
  read_timeout: 30  # 读取响应超时时间,单位秒
)

内容的提问来源于stack exchange,提问作者Dende

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:02:46