如何在自己的方法中处理异常
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
(或特定错误)中解救出来。 Exception
是 StandardError
的祖先,包括很可能无法恢复的错误(例如内存不足错误、语法错误)。
您可以使用
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
如何在它自己的方法中而不是在这个方法中处理异常?
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
(或特定错误)中解救出来。 Exception
是 StandardError
的祖先,包括很可能无法恢复的错误(例如内存不足错误、语法错误)。
您可以使用
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