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