ruby rest_client异常处理

Gio*_*ino 1 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
}
Run Code Online (Sandbox Code Playgroud)

你好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>'
Run Code Online (Sandbox Code Playgroud)

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

谢谢乔治

mia*_*t17 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
Run Code Online (Sandbox Code Playgroud)