【问题标题】:How to handle exceptions in own method如何在自己的方法中处理异常
【发布时间】:2017-01-01 07:25:09
【问题描述】:

我怎样才能用它自己的方法而不是这个来处理异常?

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

【问题讨论】:

  • 这不是 Nokogiri 问题,而是 Ruby 异常处理问题。
  • @theTinMan 我想是的,这是一个 Ruby 问题。我是否使用了错误的标题或标签?
  • 您将其标记为 Nokogiri。虽然代码中提到了 Nokogiri,但它并不重要,因为问题是关于处理异常。如果这是关于处理特定于 Nokogiri 的异常,那么标记 Nokogiri 是有意义的,否则标记 OpenURI 或 Kernel 会更有意义,因为它们提供了open 行为,这会引发读取文件的异常。这一切都是为了理解您的代码以及哪些 gem/libraries 提供了什么。
  • @theTinMan我完全同意你的看法。我不记得我标记为 Nokogiri。是的,OpenURI 标签气体更有意义。谢谢

标签: ruby-on-rails ruby optimization rescue


【解决方案1】:

首先,您几乎不想从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 方法返回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

【讨论】:

  • 好答案。请编辑它并在代码中更改 Exception => e。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多