gpt4 book ai didi

Ruby Net::HTTP 执行已过期

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:41 27 4
gpt4 key购买 nike

使用 Net::HTTP,我定期发现下面的代码从 StandardError 中解救出来并显示一条消息“执行已过期”,尽管来自所访问 URL 的 Web 服务器日志显示相应的响应已快速发送。当 Web 服务器日志显示响应时间超过 5 秒时,我通常会从 Timeout::Error 中看到代码救援。

什么情况会导致下面的代码以“执行过期”从 StandardError 中拯救而不是从 Timeout::Error 中拯救?

此代码在相对较旧的 Ruby 1.9.3 上的多线程程序中运行,该平台不支持较新版本的 Ruby。尽管该程序是多线程的,但显示的代码仅在单线程上运行。

begin
connection = Net::HTTP.new(uri.host, uri.port)
connection.open_timeout = 5
connection.read_timeout = 5
connection.start do |http|
request = Net::HTTP::Post.new("/reader_events")
request.body = body
response = http.request(request)
end
rescue StandardError => std_error
log "error sending event to server: #{std_error}"
rescue Timeout::Error => error
log "timeout sending event to server"
end

最佳答案

这是因为 rescue 的工作原理。查看 Exception 的文档页面类(class)。基本上,您可以创建许多继承自单个异常的异常,并使用父类的 rescue 处理所有异常:

begin
...
rescue Exception => exception
...
end

此代码将挽救所有类型的异常,因为 Exception 是根(其他异常继承自它)。在您的情况下 Timeout::Error 继承自 RuntimeError 继承自 StandardError:

Timeout::Error.ancestors
=> [Timeout::Error, RuntimeError, StandardError, Exception, Object, PP::ObjectMixin, Kernel, BasicObject]

结果是一种Exception:

Timeout::Error.new.is_a?(StandardError)
=> true

在您的情况下,另一件事是解释器将从上到下检查每个 rescue 语句。这意味着首先它会检查 exception 是否是一种 StandardError 然后它会移动到下面的 rescue block 。您应该始终按照从最具体到最一般的顺序列出 rescue block 。

更改 rescue block 的顺序以修复代码。

关于Ruby Net::HTTP 执行已过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39680908/

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