読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

例外を処理する

<スポンサーリンク>

RubyではKernel#raiseメソッドを呼び出してエラーの説明を渡すことにより、例外を送出することができます。
raiseメソッドを呼び出すと、実行フローはそこで中断します。

最も簡単な例外のサンプルを示します。

def raise_exception
  puts 'before raise'
  raise 'なんらかの例外が発生しました!'
  puts 'after the raise'
end

raise_exception

結果は、例外を送出し、例外以後のputsは実行されていません。

before raise
C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:4:in `raise_exception': なんらかの例外が発生しました! (RuntimeError)
	from C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:8:in `<main>'

今度は、引数が数値化どうかを調べて、数値以外の場合は例外を送出します。

def devide(x)
  raise "Argument is not numeric" unless x.is_a? Numeric

  55.5 / x
end

puts devide(5)
puts devide("hoge")

結果は以下のようになります。

11.1
C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:3:in `devide': Argument is not numeric (RuntimeError)
	from C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:9:in `<main>'

参考)is_aについて

is_a

オブジェクトが指定されたクラス mod かそのサブクラスのインスタンスであるとき真を返します。
また、オブジェクトがモジュール mod をインクルードしたクラスかそのサブクラス のインスタンスである場合にも真を返します。 上記のいずれでもない場合に false を返します。

http://docs.ruby-lang.org/ja/1.9.3/method/Object/i/kind_of=3f.html


次は、例外を救出する書き方を見てみます。
rescue節です。

begin ~ rescue ~ endで囲めば、例外が送出されたときも、「そのブロックを抜けた後のコード」は実行されます。

def raise_and_rescue
  begin
    puts 'before raise'
    raise "例外が発生しました!"
    puts 'after raise'

  rescue
    puts '救出したぜ!!'
  end

  puts "beginブロックを抜けたぜ!"
end

raise_and_rescue

これの実行結果は以下のようになります。

before raise
救出したぜ!!
beginブロックを抜けたぜ!

救出された例外に関する情報を取得したい場合は、rescue節でExceptionオブジェクトを変数にマッピングします。

def raise_and_rescue

  begin
    raise "test exception"

  rescue Exception => e
    puts "message→" + e.message
    puts "backtrace→" + e.backtrace.inspect
    puts "$!は最後に送出された例外を参照する:" + $!.message

  end

  puts "beginブロックを抜けたぜ!"
end

raise_and_rescue

結果はこのようになります。

message→test exception
backtrace→["C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:5:in `raise_and_rescue'", "C:/eclipse/pleiades/eclipse/workspace_mine/ruby-example/kiso/example.rb:17:in `<main>'"]
$!は最後に送出された例外を参照する:test exception
beginブロックを抜けたぜ!

<参考文献>

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyクックブック ―エキスパートのための応用レシピ集

  • 作者: Lucas Carlson,Leonard Richardson,株式会社クイープ
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/04/27
  • メディア: 大型本
  • 購入: 1人 クリック: 73回
  • この商品を含むブログ (55件) を見る

★ ★ ★

サンプルの結果にeclipseでRubyを書いている形跡が見えてしまうと思うんだけど、そう、Eclipseを使っています。
わかってる。

Ruby使いはvimとかemacsを駆使して書いてるって知ってる。

Rubyを書くのにIDE使うのは邪道と思われるかもしれない。

でも・・・それでも。
それでも僕は、Eclipseは人類が生み出した叡智だと思ってる。
コード補完を愛しているし、自動でエラーをチェックしてくれるのは素晴らしい。
メソッドをうろ覚えでも、Eclipseが教えてくれる。
IDE最高と声を大にして叫びたい。
※ただし、たぶんemacsでも同じことができる

でね、それゆえに、IDEが最高ゆえに、やっぱり、Javaの開発ってすごく効率がいいと思うんだよなぁ。
なんてったってEclipseとの相性がいいから。
Eclipseが素晴らしいから。
ありがとうIBM。
たしかIBMだよね?最初にEclipse作ったのって。