導入
プログラムを書いていると、「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 => eのeにエラー情報が入り、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 を付けなくても、エラーの種類だけを指定して捕まえられます。