如何让我的rails应用程序解决错误?

时间:2013-11-26 18:43:44

标签: ruby-on-rails error-handling mechanize

我的rails应用程序是使用Mechanize / Nokogiri的网络刮刀。由于KBB.com及其cookie的问题,我每次向其服务器发出新的get请求时都必须在我的应用程序中清除我的cookie jar。

agent.cookie_jar.clear!

然而,当我的应用程序正在抓取数据时,偶尔它会点击带有自动重定向的KBB.cpm页面!这会导致错误:

Mechanize::ResponseCodeError: 500 => Net::HTTPInternalServerError for http://www.kbb.com/toyota/prius/2002-toyota-prius/sedan-4d/options/?vehicleid=4843&intent=buy-used -- unhandled response

这导致我的rails应用程序崩溃,因为我无法在重定向之前清除cookie jar。相反,我希望我的应用程序做的是识别它可能会遇到错误,如果它确实使用不同的进程。类似的东西:

if there_is_an_error
  # alternative process for redirect
else
  # business as usual
end

这是我的代码:

agent = Mechanize.new
agent.cookie_jar.clear!
page = agent.get(url)
agent.cookie_jar.clear!
page.link_with(:text => "Choose this style").click
agent.cookie_jar.clear!
agent.page.link_with(:text => "Choose price type").click
agent.cookie_jar.clear!
agent.page.links_with(:text => "Get used car price")[2].click
url = agent.page.uri.to_s.sub('retail', 'private-party')
agent.cookie_jar.clear!
agent.get(url)
@kbb_value = agent.page.at('.selected .value').text.delete('$')

2 个答案:

答案 0 :(得分:1)

您应该查看处理异常的http://www.tutorialspoint.com/ruby/ruby_exceptions.htm。关于此问题还有一个堆栈溢出帖子:Begin, Rescue and Ensure in Ruby?。您可以通过在异常处理块中设置一个标志来解决问题,然后在代码中检查该标志,以确定是否发生了异常,这应该可以解决您的问题。

答案 1 :(得分:1)

你可以拯救Mechanize :: ResponseCodeError异常,然后在该块内部进行重定向的替代过程