正确的Ruby错误处理



我有一个代码块,看起来像这样:

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

现在,在终端中我看到"page not loaded",然后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函数

救援块正在返回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

我不知道你的具体需求,但"先发制人"的救援通常是个坏主意。当你有一些有用的事情要做时进行救援,否则你会阻碍更高级别的任务完成。

有很多方法可以处理这个问题下面是另一个:

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

试试这个:

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中,method的最后一个表达式是返回值,所以你可以省略你的赋值。puts方法不返回任何东西,你得到nil在抛出异常的情况下。

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

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

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

您可以尝试使用"rescue OpenURI::HTTPError => e"而不是"rescue"。

相关内容

  • 没有找到相关文章

最新更新