Rubyの例外とその捕捉――基本のbegin〜rescue〜endからensure、else、retry、後置rescueまで:若手エンジニア/初心者のためのRuby 2.1入門(9)(4/4 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、例外とその補足について、begin、rescue、end、ensure、else、retry、後置rescueなどの基本的な使い方を交えて解説します。
例外の有無にかかわらず処理する「ensure」と例外が発生しなかった場合の「else」
例外が発生しても発生しなくても行いたい処理がある場合、「ensure」を使います。似たような仕組みに「else」がありますが、こちらは、例外が発生しなかった場合のみ実行される処理を記述できます。exception06.rbに例を示しましょう。
require_relative "exception01" begin teapot = Teapot.new("coffee") teapot.pour_out rescue UnacceptableRequidError => e puts "Rescued in 'UnacceptableRequiedError => e'" p e rescue NoMethodError, ZeroDivisionError => e puts "Rescued in 'rescue NoMethodError, ZeroDivisionError => e'" p e rescue StandardError => e # rescue => e でもOK puts "Rescued in 'rescue StandardError => e'" p e else puts "There are no errors." ensure puts "Ensure" end
$ ruby exception06.rb Rescued in 'UnacceptableRequiedError => e' #<UnacceptableRequidError: unacceptable> Ensure
実行結果の4行目から、rescueによる例外処理の後にensureの中身が実行されていることが分かります。ここではbegin〜rescue間で例外が発生した場合のみを確かめているので、begin〜rescue間のコードをいろいろと変えてみて、ensureやelseの動作を確かめてみてください。
例外が発生してもリトライする「retry」
例外が発生した場合でも、リトライしたいというケースもあります。そのような場合、rescue節でretryを使うことにより、再度begin〜rescue間の処理を行えます。exception07.rbにリトライの例を示します。
require_relative "exception01" begin retry_count ||= 0 puts "Try..." teapot = Teapot.new(%w(coffee tea beer wine).sample) puts teapot.pour_out rescue UnacceptableRequidError => e retry_count += 1 retry if retry_count < 3 end
$ ruby exception07.rb Try... Try... tea
$ ruby exception07.rb Try... Try... Try...
ここでは、7行目で文字列の配列とArray#sampleメソッドを使うことで、「coffee」「tea」「beer」「wine」の中からランダムに一つ選び出して、Teapotオブジェクトの初期値に設定しています。選び出された文字列が「tea」でなければ、UnacceptableRequidErrorが発生して10行目に処理が移ります。
rescue節の中では、リトライ回数を表すretry_countを1増やして、retryを実行しています。ただし、無限ループとならないよう、後置ifを使って試行回数を3回までに制限しています。もし3回以内であれば、再度begin〜rescueが実行されます。
後置rescue
ちょっと乱暴ですが、時には「例外を握りつぶして、nilなどの値を返したい」場合があります。そのような場合は、後置rescueを使えます。pryを起動して以下のコードを実行してみましょう。
[1] pry(main)> require_relative "exception01" => true [2] pry(main)> Teapot.new("coffee") rescue nil => nil
[2]のように、rescueしたい対象のコードの末尾にrescueと返したいオブジェクトを記述することで、例外が起こった場合に特定のオブジェクトを返せます。
ただし、この書き方ではStandardErrorしか捕捉できないことに注意してください。ここでは、Teapot.newはUnacceptableRequidErrorを発生させますが、その例外は捕捉されてnilが返されます。
次回は、入出力やスレッドについて
今回は、他のオブジェクト指向言語でもポピュラーな仕組みである例外処理について解説しました。今回の知識を活用することにより、ファイルが存在しない場合など、実行時に起こる不測の事態に対処できるようなプログラムを書くことができるようになりました。
次回は、入出力やスレッドについて解説します。これらの仕組みを活用すれば、OSで利用できるコマンドと連携したRubyプログラムを書くことができるなど、日々のちょっとした問題解決にRubyを利用する助けになります。お楽しみに!
- Rubyで逆ポーランド変換機を作りgem作成&コマンドの使い方
- 難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ
- RubyのThread、Fiber、Kernel、forkで並列処理やプロセスの深淵へ
- RubyのFile/IOクラスで入力と出力、ファイルの読み取りと書き込み、フィルター作成
- Rubyの例外とその捕捉――基本のbegin〜rescue〜endからensure、else、retry、後置rescueまで
- Rubyの面白さを理解するためのメソッド、ブロック、Proc、lambda、クロージャの基本
- Rubyのオブジェクト指向におけるクラスとモジュール、継承、Mixin、アクセス制御の使い方
- RubyのNumericとTimeで数値と時間をさまざまな操作・演算・判定
- RubyのString/Regexpクラスによる強力な文字列操作/正規表現
- RubyのRangeクラスと範囲オブジェクト、範囲演算子、イテレーターの使い方
- Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方
- Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方
- Rubyプログラミングを始めるための基礎知識とインストール
著者プロフィール
麻田 優真(Rails技術者認定シルバー試験問題作成者)
イタリア、ローマ生まれ。中学生のころHSPに初めて触れ、プログラミングの楽しさを知る。オープンソースやハッカーカルチャーを好む。C#からRubyに転向したときに、動的型付け言語の柔軟性やメタプログラミングの魅力に感動し、Rubyとともにプログラマーとしての人生を歩む決意を固める。
現在は奈良先端科学技術大学院大学で学生として所属するかたわら、株式会社アジャイルウェアでプログラマーとして従事。Ruby on Railsによるコンシューマー向けのWebサービスの開発などに尽力している。
好きなメソッドは、define_method。
Twitter:@Mozamimy、ブログ:http://blog.quellencode.org/
監修者プロフィール
山根 剛司(Ruby業務開発歴7年)
兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。
2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。
2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。
Ruby関西所属。
Twitter:@spring_kuma、Facebook:山根 剛司
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 公用語に英語、「再起動」したRubyKaigi 2013が東京で開催
いったん終了していたRubyコミュニティ主催の年次イベントが再開。技術色、国際色を強め、盛況のうちに幕を閉じた - Web業界、今から行くならRubyエンジニアが狙い目?
不況で冷え込んでいたIT業界の転職市場に、回復の兆しが見え始めている。だが、業種や職種によって採用数や条件に大きな差異が生まれている。転職市場の動向を追い、自身のキャリア戦略立案に生かしてほしい。 - Ruby 2.0.0がリリース、大規模化対応の機能などを搭載
生誕20年となる節目を迎えて、プログラミング言語「Ruby」の最新版がリリースされた - 新バージョンで何が変わるのか、Rubyはどこへ向かうのか:まつもと×笹田、Ruby 1.9を語る
- いよいよ始まるRuby 1.9への移行:開発コアメンバが語るRubyの今とこれから(前編)
- Rubyの今後の進化の方向性とは?:開発コアメンバが語るRubyの今とこれから(後編)
- 互換性や脆弱性の問題にどう対応していくのか:Rubyが抱える課題、NaClの前田氏が講演
- Rails Hub情報局:「なんでRubyなんか作った!? 迷惑だ!」に対するMatzの答え
- Rails Hub情報局:Rubyはイノベーション言語として選ばれている
- Rails Hub情報局:Rubyのまつもと氏は、一発屋で終わるのか?
- Rails Hub情報局:Rubyに魔法は要らない
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 晴読雨読@エンジニアライフ:『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか
- 「JRuby 1.7.0」登場、1年半ぶりのメジャーアップデート
JavaVM上のRuby実装「JRuby」の最新版となる「JRuby 1.7.0」が、10月22日にリリースされた。