Help us understand the problem. What is going on with this article?

AdventCalendar Day09 [超Ruby入門]

More than 1 year has passed since last update.

はじめに

本記事は、超Ruby入門9日目の記事です。

コメント頂ける方は、ガイドラインを読んで頂けると幸いです。

本題

さて、今回はRSSを題材にしてRubyの例外処理を学んでいく。

まずは、下記コードを実行してみよう。

require "rss"
#pass_url:"https://www.edsurge.com/articles_rss.rss"
#error_url:"https://qiita.com/tags/ruby/feed"
rss_url = ARGV[0]
begin
    rss = RSS::Parser.parse(rss_url)
rescue RSS::InvalidRSSError => ex
    puts "error message: " + ex.message
    rss = RSS::Parser.parse(rss_url, false)
    puts
end

rss.items.each do | item |
    begin
        puts item.title
        puts item.link
        puts item.description
        puts
    rescue StandardError => ex
        puts "error class: "+ ex.class.to_s
        puts "error message: " + ex.message
        puts "error backtrace: " + ex.backtrace.to_s
    end
    break
end
$ruby rss.rb https://www.edsurge.com/articles_rss.rss

該当URLにアクセスしてみると、出力と似たようなデータが取得できているはずだ。

長くなるためbreak処理しているので注意してね。

RSS

例外処理を説明する前に、RSSについて少しだけ知識をつけておこう。

RSS(Rich Site Summary)とは、特定サイトの簡易情報をまとめたXMLファイルだ。

もしRSSがなかったらどうなるだろか?わざわざサイトを巡回して新しい記事が更新しているかを確認しないといけなくなる。時間は有限だ。出来るだけアルコールを摂取することに時間をかけるには、複数のサイトからの更新を一度に見れた方が便利だろう。

そんな時には、RSSが役立つ。一種の自動化ができるわけだ。図で理解したい人はRSS in Plain Englishを見ると良い。

RSSとWeb APIの違いについても調べてみるといいかもしれない。

例外

## 構文

begin
# 例外が起こる可能性がある処理
resuce
# 例外が起こった場合の処理
end

上記が例外処理の基本的な構文だ。
下のコードでは、RSS::Parser.parse(rss_url)にてRSS::InvalidRSSErrorの例外が発生した時に、rescueで捕捉している。
捕捉した例外は変数に格納することができるんだ。それが => exの部分。

begin
    rss = RSS::Parser.parse(rss_url)
rescue RSS::InvalidRSSError => ex
    puts "error message: " + ex.message
    rss = RSS::Parser.parse(rss_url, false)
    puts
end

さて、捕捉した例外オブジェクトexに対してメソッドを呼ぶ出すことができる。

メソッド 説明
Object#class レシーバがどのクラスのインスタンスなのかを教えてくれる。例外オブジェクトをレシーバにすると Exception であることが分かる。
Exception#message エラーメッセージをあらわす文字列を返します。
Exception#backtrace バックトレース情報を返します。
rss.items.each do | item |
    begin
        puts item.title
        puts item.link
        puts item.description
        puts
    rescue StandardError => ex
        puts "error class: "+ ex.class.to_s
        puts "error message: " + ex.message
        puts "error backtrace: " + ex.backtrace.to_s
    end
    break
end

$!と$@

さっきは、exに例外オブジェクトを格納した。

Kernelモジュールに定義されている特殊変数で同様のことが実現できる。

特殊変数 説明
$! 最後に例外が発生したときの Exception オブジェクトです。 該当する例外がないときは nil です。
$@ 最後に例外が発生した時のバックトレースを表す配列です。 Kernel.#raise によって設定されます。

$!は、ex。$@は、ex.backtraceに相当する。

rss.items.each do | item |
    begin
        puts item.title
        puts item.link
        puts item.description
        puts
    rescue StandardError
        puts "error class: "+ $!.class.to_s
        puts "error message: " + $!.message
        puts "error backtrace: " + $@.to_s
    end
    break
end

例外処理の説明は以上だ。

imaharu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした