ruby rest_client异常处理

时间:2013-12-04 09:35:21

标签: ruby exception-handling rest-client

我想在Ruby中使用rest-client gem做一些HTTP REST请求,

关注https://github.com/rest-client/rest-client的readme.md 我编写了这个简单的命令行脚本,尝试在响应代码不同于2xx的情况下捕获异常:

RestClient.get('http://thisurldoesnotexist/resource') { |response, request, result, &block|
case response.code
  when 200
    p "It worked !"
    response
  else
    response.return!(request, result, &block)
  end
}

你在stdout输出上得到了这个:

/home/*****/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `initialize': getaddrinfo: Name or service not known (SocketError)
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `open'
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:877:in `connect'
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
    from /home/solyaris/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:851:in `start'
    from /home/solyaris/.rvm/gems/ruby-2.0.0-p247/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit'
    from /home/solyaris/.rvm/gems/ruby-2.0.0-p247/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute'
    from /home/solyaris/.rvm/gems/ruby-2.0.0-p247/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
    from /home/solyaris/.rvm/gems/ruby-2.0.0-p247/gems/rest-client-1.6.7/lib/restclient.rb:68:in `get'
    from prova_rest.rb:3:in `<main>'

我如何捕获SocketError? 哪里我错了?

感谢 乔治

1 个答案:

答案 0 :(得分:5)

仅当从服务器接收某些响应时才执行回调块。在这种情况下,名称解析失败,因此RestClient.get只是抛出异常而不进入块。因此,只需将代码包装在begin...end构造中。

begin
  RestClient.get('http://thisurldoesnotexist/resource') { |response, request, result, &block|
  case response.code
    when 200
      p "It worked !"
      response
    else
      response.return!(request, result, &block)
    end
  }
rescue SocketError => e
  # Handle your error here
end