gpt4 book ai didi

ruby - RobuSTLy 调用不稳定的 API:使用 Net::HTTP 进行正确的错误处理

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:53 25 4
gpt4 key购买 nike

我将其组合在一起,作为一种看似可靠的方式来调用不稳定的 Web 服务,该服务会出现超时和偶尔的名称解析或套接字错误或其他任何问题。我想我会把它放在这里以防它有用,或者更有可能被告知执行此操作的更好方法。

require 'net/http'

retries = 5
begin
url = URI.parse('http://api.flakywebservice.com')
http = Net::HTTP.new(url.host, url.port)
http.read_timeout = 600 # be very patient
res = nil
http.start{|http|
req = Net::HTTP::Post.new(url.path)
req.set_form_data(params) # send a hash of the POST parameters
res = http.request(req)
}
rescue Exception # should really list all the possible http exceptions
sleep 3
retry if (retries -= 1) > 0
end

# finally, do something with res.body, like JSON.parse(res.body)

这个问题的核心是:像这样调用网络服务时,我应该寻找哪些异常?这是将它们全部收集起来的尝试,但似乎必须有比这更好的方法: http://tammersaleh.com/posts/rescuing-net-http-exceptions

最佳答案

异常是有意义的,Net::HTTP 为不同类型的情况提供特定的异常。因此,如果您想以特定方式处理它们,您可以。

那篇文章说处理那些特定异常比处理rescue Exception 更好/更安全,这是千真万确的。但是,rescue Exceptionrescue 本身不同,后者等同于 rescue StandardError,这是您通常应该默认执行的操作,如果您没有理由做任何其他事情。

挽救顶级Exception 将挽救整个执行堆栈中可能发生的任何事情,包括 ruby​​ 的某些部分磁盘或内存耗尽或出现一些与系统相关的模糊 IO 问题。

因此,就“拯救什么”而言,如果将代码更改为rescue,通常情况会更好。你会捕获你想要的一切,没有你不想要的。然而,在这种特殊情况下,那个人的列表中有一个单独的异常,它不是 StandardError 的后代:

def parents(obj)
( (obj.superclass ? parents(obj.superclass) : []) << obj)
end

[Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse,
Net::HTTPHeaderSyntaxError, Net::ProtocolError].inject([]) do |a,c|
parents(c).include?(StandardError) ? a : a << c
end
# Timeout::Error < Interrupt

parents(Timeout::Error)
# [ Object, Exception < Object, SignalException < Exception,
# Interrupt < SignalException, Timeout::Error < Interrupt ]

因此,您可以将代码更改为 rescue StandardError, Timeout::Error => e 并且您将涵盖那篇文章中提到的所有情况,甚至更多,但不包括您不了解的内容'想要覆盖。 (=> e 不是必需的,但更多内容在下面)。

现在,就您处理 flakey API 的实际技术而言——问题是,您正在处理的 API 有什么问题?格式错误的响应?没有回应?问题是在 HTTP 级别还是在您返回的数据中?

也许您还不知道,或者您还不关心,但您知道重试往往会完成工作。在那种情况下,我至少会建议记录异常。 Hoptoad有一个免费计划,并且有类似 Hoptoad.notify(e) 之类的东西——我不记得这是否是确切的调用。或者您可以使用 e.messagee.stacktrace 通过电子邮件发送或记录它。

关于ruby - RobuSTLy 调用不稳定的 API:使用 Net::HTTP 进行正确的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com