如何在自己的方法中处理异常

时间:2016-08-25 01:50:50

标签: ruby-on-rails ruby optimization rescue

如何在自己的方法中处理异常而不是这个呢?

items.each do |item|
  begin
    url = item.url
    page = Nokogiri::HTML(open(url).read)
  rescue Exception => e
    puts "Couldn't read \"#{ url }\": #{ e }"
  else
    title = get_title(page)
  end
end

类似的东西:

def get_page(url)
  begin
    Nokogiri::HTML(open(url).read)
  rescue Exception => e
    puts "Couldn't read \"#{ url }\": #{ e }"
  end
end

#and then call:

items.each do |item|
 get_page(url)
 title = get_title(page)
end

我应该在哪里放置else条款?

1 个答案:

答案 0 :(得分:1)

首先,你几乎不想从Exception拯救。而是从StandardError(或特定错误)中解救。 ExceptionStandardError的祖先,包含最有可能无法恢复的错误(例如,内存不足错误,语法错误)。

您可以使用

rescue => e

拯救标准错误或

rescue StandardError => e

任何类型的Nokogiri解析错误都应该从StandardError继承。 Net / HTTP有点问题。请参阅“What’s the best way to handle exceptions from Net::HTTP?”,但您可以单独拯救它们。

现在回答你的问题。您可以从nil方法返回get_page,并在获取标题之前检查get_page的结果是否为nil

def get_page(url)
  Nokogiri::HTML(open(url).read)
rescue => e
  puts "Couldn't read \"#{ url }\": #{ e }"
  nil
end

items.each do |item|
  url = item.url
  page = get_page(url)

  if page
    title = get_title(page)
  end
end