Edited at
移行Day 9

AdventCalendar Day09 [超Ruby入門]


はじめに

本記事は、超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

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