【问题标题】:How to handle exceptions with Ruby Rest-Client如何使用 Ruby Rest-Client 处理异常
【发布时间】:2012-07-10 12:07:35
【问题描述】:

我最近从 Ruby 的 Net:HTTP 类切换到了 rest-client 1.6.7。

我发现形成请求要容易得多,但与 Net:HTTP 请求不同,当 rest-client 得到 200 以外的任何内容时,请求就会终止。我尝试在 RestClient.get 之后直接放置一个断点,但它永远不会被命中 - 所以我做错了什么。

def get_member_using_card
  resource = "#{@settings_app_uri}api/v1/card/#{self.member_card_num}?token=#{@settings.api_key}"
  response = RestClient.get resource
  if response.code == 200 
    card = JSON.parse(response.body)
    self.customer_id = card['card']['customer_id']
  else
    return 0
  end
end

这会导致此堆栈跟踪:

RestClient::ResourceNotFound - 404 Resource Not Found:
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/abstr
act_response.rb:48:in `return!'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:230:in `process_result'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:178:in `block in transmit'
        /Users/tim/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/http.rb:627:in `start'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:172:in `transmit'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:64:in `execute'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:33:in `execute'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient.rb:68
:in `get'

谁能告诉我如何正确评估响应代码并防止此异常发生...?

【问题讨论】:

    标签: ruby rest-client


    【解决方案1】:

    查看http://rubydoc.info/gems/rest-client/上的标题例外

    • 对于 200 到 207 之间的结果代码,将返回 RestClient::Response
    • 对于结果代码 301、302 或 307,如果请求是 get 或 head,则将遵循重定向
    • 对于结果代码 303,将遵循重定向并将请求转换为 get
    • 对于其他情况,将引发包含响应的 RestClient::Exception,将抛出特定的异常类以获取已知错误代码

    RestClient.get 'http://example.com/resource'
    ➔ RestClient::ResourceNotFound: RestClient::ResourceNotFound`
    
    begin
      RestClient.get 'http://example.com/resource'
    rescue => e
      e.response
    end
    ➔ 404 Resource Not Found | text/html 282 bytes
    

    【讨论】:

      【解决方案2】:

      同样在@wich 指出的同一个文档中,您可以将一个块传递给 RestClient.get,这样它就不会在非 200 响应代码上引发异常:

      # Don't raise exceptions but return the response
      RestClient.get('http://example.com/resource'){|response, request, result| response }
      

      请参阅“结果处理”部分from the documentation

      【讨论】:

        【解决方案3】:
        rescue RestClient::ExceptionWithResponse => err
        

        【讨论】:

          【解决方案4】:

          可能会发生几个错误,具体的异常类型如 Errno::EHOSTUNREACH 或更通用的 ExceptionWithResponse。 Check the readme 了解更多信息。

          【讨论】:

            【解决方案5】:

            在休息客户端处理异常的好方法。

            更多信息请查看rest-client#response-callbacks-error-handling

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-22
              • 1970-01-01
              • 1970-01-01
              • 2016-01-17
              • 2014-02-04
              • 1970-01-01
              • 1970-01-01
              • 2015-09-01
              相关资源
              最近更新 更多