lispとrubyとpythonと その5 例外処理(ruby)

common lispと比べると普通。

# -*- coding: utf-8 -*-
#例外処理
def test1
  begin
    #raise
    #例外を発生させる
    #raiseだけ書くとRuntimeErrorになる
    #raise
    #raise "test error!"

    #例外の種類を指定して発生させる
    #その1
    #カンマで区切って例外クラスとメッセージを書く
    #raise ArgumentError
    #raise ArgumentError,"test error!"
    
    #その2
    #インスタンスを作って指定
    raise ArgumentError.new "test error!"

  #例外が発生したときの処理
  rescue
    puts "例外発生\n"

  #例外が発生しなかったときの処理
  else
    puts "例外発生せず\n"

  #例外発生してもしなくてもやる処理
  #finally
  ensure
    puts "終了処理"
  end
end

test1
#->例外発生
#  終了処理
#=>true

#特定の例外だけを補足
#複数指定するときはrescueを並べる
#この辺もjavaとかC#と一緒
def test2
  begin
    raise ArgumentError,"error!"
#    raise StandardError,"error!"
  rescue ArgumentError
    puts "ArgumentError!\n"
  rescue StandardError
    puts "StandardError!\n"
  ensure
    puts "ensure\n"
  end
end

test2
#->ArgumentError!
#  ensure
#=>nil

#retry
#処理をやり直す
#下のコードでいうとtest4の呼び出しからやりなおす
def test3
  begin
    test4
  rescue
    puts "handle error!\n"
    retry
  end  
end

def test4
  puts "start test4\n"
  raise "error!" if readline == "error\n"
  puts "end test4\n"
end

test3
#->start test4
#errorを入力
#->handle error!
#->start test4
#aaaaを入力
#->end test4
#=>nil

#例外をキャッチ
def test5
  begin
    raise "error!"

    #rescue => xxx でxxxに例外が入る

  rescue ArgumentError => ae
    puts "handle:" + ae.to_s
  rescue => er
    puts "handle:" + er.to_s
  end
end

test5
#->handle:error!
#=>nil

#独自の例外
#Exceptionのサブクラスを作る
class MyException < Exception
end

def test6
  begin
 raise MyException,"error!!"
  rescue MyException => ex
    puts "handle:" + ex.to_s
  end
end

test6
#->handle:error!!
#=>nil