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

How to handle exceptions in own method

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

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 子句放在哪里?

首先,您几乎不想从 Exception 中解救出来。而是从 StandardError(或特定错误)中解救出来。 ExceptionStandardError 的祖先,包括很可能无法恢复的错误(例如内存不足错误、语法错误)。

您可以使用

rescue => e

从标准错误中拯救或

rescue StandardError => e

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

现在回答你的问题。您可以从 get_page 方法 return nil 并在获取标题之前检查 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