我有一个代码块,看起来像这样:
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"。