Ruby中的正确错误处理

时间:2011-12-02 21:21:20

标签: ruby error-handling nokogiri

我有一段看起来像这样的代码:

def create_page_object(url)
  begin
    page = Nokogiri::HTML(open(url))
  rescue
    puts "page not loaded"
  end
end

然后我通过以下方式调用它:

result.each do |url|
  page = create_page_object(url)
  content = make_content(page)
end

现在,在终端中我看到“页面未加载”然后Ruby炸毁了我。我该怎么说,“如果页面未加载,请停止并转到下一个项目。”

更新

爆炸的科学定义:

test.rb:70:in `get_title': undefined method `xpath' for nil:NilClass (NoMethodError)
    from test.rb:40:in `block (2 levels) in process'
    from test.rb:35:in `each'
    from test.rb:35:in `block in process'
    from test.rb:32:in `upto'
    from test.rb:32:in `process'
    from test.rb:138:in `<main>'

我认为发生的事情是因为没有加载,没有页面变量设置,这是nil并且被抛入make_content函数。

5 个答案:

答案 0 :(得分:2)

救援区正在返回puts的输出(nil),您必须确保在使用之前有文档。另请注意,在救援中您应该显式返回nil以明确该分支中返回的方法是什么。我写道:

def create_page_object(url)
  begin
    page = Nokogiri::HTML(open(url))
  rescue
    puts "page not loaded"
    nil
  end
end

result.each do |url|
  if (page = create_page_object(url))
    content = make_content(page)
  end
end

我不知道你的具体需求,但做“先发制人”救援通常是个坏主意。当你有一些有用的东西可以拯救,否则你就会阻止更高的等级。

答案 1 :(得分:2)

有很多方法可以解决这个问题,所以这是另一种方法:

def create_page_object(url)
  begin
    page = Nokogiri::HTML(open(url))
    yield page
  rescue
    puts "page not loaded"
  end
end

result.each do |url|
  create_page_object(url) { |page| content = make_content(page) }
end

但是如果您需要在区块之外的content

content =  nil
result.each do |url|
  create_page_object(url) { |page| content = make_content(page) }
end

或者您可以在块中添加更多content处理逻辑:

result.each do |url|
  create_page_object(url) do |page|
    content = make_content(page)
    # do interesting things with 'content' here
  end
end

答案 2 :(得分:1)

这样做的一种方法是在create_page_object(url)中返回nil,如果你必须解救它,如果在Nokogiri :: HTML(open(url)中加载它则返回true)。这样你就可以测试它是否为零,如果是这样的话,可以测试它是否接下来。例如:

def create_page_object(url)
  begin
    page = Nokogiri::HTML(open(url))
  rescue
    puts "page not loaded"
    return nil
  end
end

result.each do |url|
  page = create_page_object(url)
  next if page.nil?
  content = make_content(page)
end

我很惊讶&#34; Nokogiri&#34;如果页面没有加载而不是返回一个nil对象,则抛出一个异常,但如果这是它的工作原理,那么这个方法应该为你做。祝你好运。

答案 3 :(得分:1)

试试这个:

def create_page_object(url)
  begin
    Nokogiri::HTML(open(url))
  rescue
    puts "page not loaded"
  end
end

result.each do |url|
  page = create_page_object(url)
  next if page.nil?
  content = make_content(page)
end

在Ruby中,方法中的最后一个表达式是返回值,因此您可以省略赋值。 puts方法不返回任何内容,如果抛出异常,您将获得nil

答案 4 :(得分:0)

您可以尝试使用“救援OpenURI :: HTTPError =&gt; e”而不仅仅是“救援”。