2016-08-25 41 views
0

如何處理異常而不是自己的方法?如何處理自己方法中的異常

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條款?

+0

這不是一個問題,引入nokogiri,這是一個Ruby的異常處理問題。 –

+0

@theTinMan我認爲,這是一個Ruby問題。我使用了錯誤的標題或標籤嗎? –

+0

您將它標記爲Nokogiri。雖然在代碼中提到了Nokogiri,但這並不重要,因爲這個問題是關於處理異常的。如果這是爲了處理Nokogiri特定的異常,那麼標記Nokogiri將是有意義的,否則標記OpenURI或Kernel會更有意義,因爲這些提供了「開放」行爲,會引發讀取文件的異常。這完全是關於理解你的代碼,以及什麼寶石/庫提供什麼。 –

回答

1

首先,你幾乎從不想從Exception營救。相反,從StandardError(或具體的錯誤)救援。 ExceptionStandardError的祖先,幷包含最有可能無法恢復的錯誤(例如,內存不足錯誤,語法錯誤)。

您可以使用

rescue => e 

從標準錯誤或

rescue StandardError => e 

任何類型的引入nokogiri解析錯誤應從StandardError繼承搶救。淨/ 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 
+0

很好的答案。請編輯它並在代碼中更改Exception => e。 –

+0

我已經刪除了代碼中的異常。 – kcdragon