1.例外処理 ー resque ー

begin
	|#例外が発生するであろう処理
rescue
	|#例外が発生したときの処理
end

もとの処理

puts "金額を入力してください"
bill = gets.to_i
puts "割り勘する人数を入れてください"
number = gets.to_i

warikan = bill / number
puts "一人あたり#{warikan}円です"

例外処理Ver.

puts "金額を入力してください"
bill = gets.to_i
puts "割り勘する人数を入れてください"
number = gets.to_i
begin
warikan = bill / number
puts "一人あたり#{warikan}円です"
rescue ZeroDivisionError
  puts "0人で割るつもりですか?"
end

例外処理Ver.2

def warikan(bill, number)
  warikan = bill / number
  puts "一人あたり#{warikan}円です"
rescue ZeroDivisionError
  puts "0人で割るつもりですか?"
end

warikan(100, 4)
warikan(100, 0)

エラー情報の獲得

#--------ruby_rescue.rb--------------
def cat(filename)
  File.open(filename) do |file|
    file.each_line {|line| puts line}
  end
rescue SystemCallError => e
  puts "例外が発生しました"
  puts "例外クラス#{e.class}"
  puts "例外メッセージ#{e.message}"
end

filename = ARGV.first
cat(filename)

#----------Ruby_dea1.rb----------------
"ふぁいるのないよう"

<コマンドプロント>
$ruby ruby_rescue.rb Ruby_def1.rb
=> "ふぁいるのないよう"

$ruby ruby_rescue.rb Ruby_XXX.rb
例外が発生しました
例外クラスErrno::ENOENT
例外メッセージNo such file or directory @ rb_sysopen - Ruby_XXX.rb

2.例外を発生させる ー raiseメソッド ー

raise "例外メッセージ"#メッセージは任意で何でもかける

3.例外の有無に関わらず、必ず処理を実行する

begin
	|#例外が発生するであろう処理
rescue
	|#例外が発生したときの処理
ensure
	|#例外があったとしても無かったとしても実行する処理
end
def type(age)
  if age < 0
    raise "年齢がマイナスです#{age}歳"
  elseif age < 20
  "未成年"
  else
    "成年"
  end
end

begin
  age = ARGV.first.to_i#コマンドラインの引数を整数に変換して「age」に格納する
  type = type(age)
  puts "#{age}歳は#{type}です"
rescue => e
  puts "例外が発生しました:#{e.message}"
ensure
  puts "ご利用ありがとうございました"
end

$ ruby ruby_rescue.rb 20
20歳は成年です
ご利用ありがとうございました

$ ruby ruby_rescue.rb -5
例外が発生しました:年齢がマイナスです-5歳
ご利用ありがとうございました#----------- 例外が発生しても実行される ---------------------