Top > Ruby > 例外処理

このページの概要

  • オブジェクト指向とは切っても切れない「例外」について。
  • 動作確認環境 : Ruby 1.8.4

例外を発生させてみる

 いちばん簡単に再現できる例外は「ゼロ除算」の例外でしょう。電卓で 1 ÷ 0 = とすると E になってしまうアレです。

  0
  1
  2
#!/usr/bin/env ruby
puts 1 / 0 #=> (例外メッセージ) -:2:in `/': divided by 0 (ZeroDivisionError) from -:2
puts "ok." # 例外発生のため、ここまで処理が来ない(例外に対して何もしないと、スクリプトが強制終了となる)

例外をとらえる begin rescue ensure end 構文

 例外が発生してもスクリプトを強制終了させないためには、例外が発生しそうな部分に対して begin end でくくり、その中に rescue という「例外を捕まえる(Java や C# では catch と呼ばれていますね)」構文を入れます。

下記コードは、gets.to_i が 0 になる (0 や数字以外の文字をキーボードから入力した場合) という条件で 0 / 0 (ゼロ除算) となります。ensure については省略可能です。

  0
  1
  2
  3
  4
  5
  6
  7
  8
#!/usr/bin/env ruby
i = gets.to_i
begin
  i = i / i
rescue
  puts "例外が発生しましたよ" # 例外発生時のみ表示される
ensure
  puts "終了処理"           # 例外有無にかかわらず必ず表示される
end

例外を発生させる raise 構文

 ソースコードの途中に raise という構文を使うことで、意図的に好きな例外を発生させることができます。以下のコードは例外を起こす一例です (実質、1行目で実行が止まるのでサンプルとしての意味はありません。説明用です。)

  0
  1
  2
  3
  4
  5
  6
  7
  8
#raise 単独で呼べます。
raise #=>「unhandled exception」
 
#raise RuntimeError, "メッセージ" の省略記法
raise "メッセージ" #=>「メッセージ (RuntimeError)」 
 
#raise (Exception派生クラス指定) で好きな例外を起こせます。 
raise IOError                #=> 「IOError (IOError)」
raise IOError, "入出力でエラー" #=> 「入出力でエラー (IOError)」

例外の種類によって処理コードを切り替える

 rescue 例外の種類 とすると、その例外の種類だけに限定した処理を記述できます。
 最後に rescue だけ (例外の種類指定無し) を置くと、限定処理対象とならなかった残りの例外すべてがそこで実行されることになります。

 以下のコードでは、0 や文字ではゼロ除算専用の処理が、10 のときは「ほかの例外」の処理が行われることを確認できます。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
#!/usr/bin/env ruby
i = gets.to_i
begin
  i = 10 / i
  if(i == 1 ) then
    raise          #入力値が10なら i = 10 / 10 (つまり i == 1) で exception を起こす
  end
rescue ZeroDivisionError
  puts "ゼロ除算例外を検知"
rescue
  puts "ほかの例外を検知"
ensure
  puts "終了処理"
end

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 22 Jul 2011 21:57:58 JST (1525d)