学習記録

アウトプット用に作りました

例外処理

想定外の問題が発生した時、Rubyはエラーメッセージを表示してプログラムを停止させます。
ええ。なんかエラー出た。。先に進めない。。。
そんな時に、これはエラーだよ!間違えてるよ!と教えてくれたらとっても親切ですよね。
そこで、、、わかりやすくエラーメッセージを書き換えるための例外処理という機能を使っていきます。


begin
# 例外が発生するかもしれない処理
rescue 例外クラス => e # 例外オブジェクトを変数eに代入
# 例外が発生した時に実行する処理
ensure
# 例外の発生有無にかかわらず必ず実行される処理
end



※ beginとendは省略できます。


rescueの後ろに書く「例外クラス」には、
ZeroDivisionError : 0での割り算を行った時に発生する例外クラス
ArgumentError : メソッドの引数の数が間違っている時に発生する例外クラス
NameError : 変数名を間違えた時に発生する例外クラス
NoMethodError : メソッド名を間違えた時に発生する例外クラス
SystemCallError : ファイル操作などに失敗した時に発生する例外クラス
などが入ります。
「例外クラス」は省略可。
省略した場合、StandardErrorが代入されますが、
上に書いたような例外クラスは、StandardErrorに属してるので問題なく省略できます。


puts "駅まで何メートルありますか?"
length = gets.to_i
   # gets はキーボードからの入力を取り込むメソッド
puts "何分歩きましたか?"
time = gets.to_i

begin
    speed = length / time
    puts "速さは分速#{speed}mです。"

rescue ZeroDivisionError => e
    puts "あれ?0分だと計算できないよ〜"
    puts "例外クラス: #{e.class}"
    puts "例外メッセージ: #{e.message}"
       # classとmessageは例外クラスで使えるメソッド
ensure
    puts "お疲れさま"

end


例外が発生しない時は、rescueの処理は実行されない。
beginの処理 + ensureの処理 が出力されます。

駅まで何メートルありますか?
700
何分歩きましたか?
5
速さは分速140mです。
お疲れさま


例外が発生する時は、rescueの処理を実行する。
rescueの処理 + ensureの処理 が出力されます。

駅まで何メートルありますか?  
700  
何分歩きましたか?  
0  
あれ?0分だと計算できないよ〜  
例外クラス: ZeroDivisionError  
例外メッセージ: divided by 0  
お疲れさま  


例外を発生させるraiseメソッドというものもあります。
raise "例外メッセージ"
※例外メッセージのみを指定するとRuntimeError例外が発生します。

特定の例外クラスを指定することもできます。例えば、
raise NameError, "例外メッセージ"
※NameError例外を発生させるときはこのように書きます。


例外処理は引数を書き忘れてしまいそうな処理の時とかに使えそうですね!
遠くない未来、バリバリ使えるように精進します。