2016-08-25 37 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 вопроса, это рубин обработка исключений вопроса. –

+0

@theTinMan Я так думаю, это вопрос Ruby. Я использовал неправильный заголовок или тег? –

+0

Вы отметили его как Nokogiri. Хотя Nokogiri упоминается в коде, это не важно, поскольку речь идет об обработке исключений. Если бы это касалось обработки исключений, специфичных для Nokogiri, то пометка Nokogiri имела бы смысл, иначе маркировка OpenURI или Kernel имела бы больше смысла, поскольку те, которые поставляют поведение 'open', которые повышают исключение, просматривая файл. Это все о понимании вашего кода и о том, какие камни/библиотеки поставляют. –

ответ

1

Для начала вы почти никогда не хотите спасать от Exception. Вместо этого спасение от StandardError (или особых ошибок). Exception является предком StandardError и содержит ошибки, которые, скорее всего, не подлежат восстановлению (например, ошибка памяти, ошибка синтаксиса).

Вы можете использовать

rescue => e 

спасти от стандартной ошибки или

rescue StandardError => e 

Любой тип ошибки синтаксического анализа Nokogiri должен унаследовать от StandardError. Net/HTTP немного сложнее. См. «What’s the best way to handle exceptions from Net::HTTP?», но вы можете просто спасти их индивидуально.

Теперь на ваш вопрос. Вы можете вернуться nil из метода get_page и проверить, если результат 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