静岡理工科大学 菅沼ホーム Ruby 目次 索引

制御構造

  Rubyでは,C などとは異なり,制御構造は式であって,何らかの値を返すものがあります(返さないものもあります).
  1. 条件分岐
  2. 繰り返し
  3. 例外処理
  4. その他

  1. 条件分岐

  2. 繰り返し

  3. 例外処理
    	begin
    		式1
    	[rescue [error_type,・・・] [=> evar] [then]
    		式2]
    	・・・・・
    	[else
    		式n]
    	[ensure
    		式m]
    	end
    		
      begin 式内の本体(式1)において例外が発生すると.rescue 節などによって,その例外を処理することができます.raise は,例外を発生させるための組み込み関数であり,
    	raise
    	raise messageまたはexception
    	raise error_type, message
    	raise error_type, message, traceback
    		
    のように記述されます.第一の形式では,直前の例外を再発生させます.第二の形式では,引数が文字列であった場合,その文字列をメッセージとする RuntimeError 例外を発生させます.引数が例外オブジェクトであった場合には,その例外を発生させます.第三の形式では,第一引数で指定された例外を,第二引数をメッセージとして発生させます.第四の形式の第三引数は,組み込み変数 $@ 等で得られるスタック情報であり,例外が発生した場所を示します.

      本体の実行中に例外が発生した場合,rescue 節(複数指定できます)が与えられていれば例外を捕捉できます.発生した例外に一致する rescue 節が存在する時には( error_type を省略するとすべての例外に一致),rescue 節の本体が実行されます.発生した例外は 組み込み変数 $! を使って参照することができます.また,=> によって指定されていれば,変数 evar にも $! と同様に発生した例外が格納されます.

      省略可能な else 節は,本体の実行によって例外が発生しなかった場合に評価されます.ensure 節が存在する時は,begin 式を終了する直前に必ず ensure 節の本体を評価します.

      次の枠内に示すプログラムは,0 による除算,及び,raise によって,2 つの例外,ZeroDivisionError 及び RuntimeError を発生させています.ZeroDivisionError が発生した場合は,rescue 節において変数 x の値を変更した後,retry を実行しています( begin 式の再実行).このプログラムを実行すると,以下に示すような結果が得られます.
    #<ZeroDivisionError: divided by 0>
    ["test.rb:3:in `/'", "test.rb:3"]
    #<RuntimeError: エラー発生!>
    ["test.rb:4"]
    最後の処理
    y = 5
    		
    x = 0
    begin
    	y = 10 / x
    	raise "エラー発生!"
    rescue ZeroDivisionError
    	p $!
    	p $@
    	x = 2
    	retry
    rescue
    	p $!
    	p $@
    ensure
    	printf "最後の処理\n"
    end
    printf "y = %d\n", y
    		
  4. その他

静岡理工科大学 菅沼ホーム Ruby 目次 索引