2016-08-25 6 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 

ような何か:私はelse句を置くべき

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 

+0

これは、それが問題を扱うRubyの例外だ、鋸山の質問ではありません。 –

+0

@theTinMan私はそう思います、それはRubyの質問です。間違ったタイトルやタグを使用しましたか? –

+0

あなたはそれをNokogiriとタグ付けしました。 Nokogiriはコードで言及されていますが、問題は例外処理に関するものではありません。これがNokogiri特有の例外を処理する場合、Nokogiriをタグ付けすることは意味があります。そうでなければ、OpenURIまたはKernelをタグ付けすることは、ファイルを読み出す例外を発生させる 'open'動作を提供するので、より意味をなさないでしょう。それはあなたのコードと、宝石/図書館が何を供給しているかを理解することです。 –

答えて

1

開始するには、ほとんどあなたはExceptionから救いたいです。代わりにStandardError(または特定のエラー)から救助してください。 Exceptionは祖先でStandardErrorであり、復旧できない可能性が最も高いエラーが含まれています(メモリ不足エラー、構文エラーなど)。

あなたは鋸山解析エラーの任意のタイプは、StandardErrorから継承する必要があり、標準エラーまたは

rescue StandardError => e 

から救うために

rescue => e 

を使用することができます。 Net/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

コード内でExceptionを削除しました。 – kcdragon

関連する問題