本文へスキップ
BecomeCoder

Rubyコース · 第8章 実践とこれから · レッスン34

例外処理 ― begin/rescue/raise

ブラウザで完結

導入

プログラムを書いていると、「0で割ってしまった」「想定外の値が来た」といった問題(例外)が起きることがあります。何もしないとプログラムはそこで止まってしまいますが、Ruby には例外に対処するしくみが用意されています。

説明

graph TD
  A["begin"] --> B{"エラー発生?"}
  B -- Yes --> C["rescue で捕まえる"]
  B -- No --> D["そのまま進む"]
  C --> E["ensure(必ず実行)"]
  D --> E

begin ... rescue ... end で、エラーが起きそうな処理を囲みます。

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError => e
  puts "エラー: #{e.message}"
end

def check_age(age)
  raise "年齢は0以上で指定してください" if age < 0
  puts "年齢は#{age}歳です"
end

begin
  check_age(-5)
rescue => e
  puts "捕まえたエラー: #{e.message}"
ensure
  puts "処理を終了します"
end
  • begin から rescue の手前までがエラーの起きうる処理です。
  • エラーが起きると rescue 以降が実行されます。rescue => ee にエラー情報が入り、e.message でエラーメッセージを取り出せます。
  • raise "メッセージ" で自分から意図的にエラーを発生させられます。
  • ensure はエラーが起きても起きなくても必ず実行される処理を書く場所です(後片付けなどに使います)。

やってみよう

10 / 0 の代わりに 10 / 2 にしてエラーが起きないケースを試したり、check_age の引数を 20 にしてエラーが起きない場合の流れを確認しましょう。

演習

begin/rescue を使って 100 / 0 を計算しようとし、ZeroDivisionError を捕まえて "ゼロ除算エラーです" と表示してください。

ヒント1を見る

begin 100 / 0 rescue ZeroDivisionError puts "ゼロ除算エラーです" end のように書きます。

ヒント2を見る

rescue のあとに => e を付けなくても、エラーの種類だけを指定して捕まえられます。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。