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
相关产品推荐
相关产品推荐

