プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Ruby1.9、例外処理の基本
Rubyさんの例外処理も基本的にはJava等と同じみたいです。
記述する単語は違うみたいですけどね(-A-)

Javaでいう

「try」~「catch」~「finally」

がRubyでは

「begin」~「rescue」~「ensure」

になるだけで扱い方はほぼ同じです。

こんなんを実行するとφ(--)

  # -*- coding: shift_jis -*-
  
  #まとめてハンドリング
  puts "◇まとめてハンドリング"
  begin
      #ファイルが無いよエラーを発生させる
      f = File.open("hoge.txt")
  rescue 
      puts "エラー1"
  end
  
  #エラーナンバーでのハンドリング
  puts "◇エラーナンバーでのハンドリング"
  begin
      #ファイルが無いよエラーを発生させる
      f = File.open("hoge.txt")
  rescue Errno::ENOENT => err1
      puts "Errno::ENOENT => err1"
      STDERR.puts err1.message
  end
  
  #クラスでのハンドリング
  puts "◇クラスでのハンドリング"
  begin
      #ファイルが無いよエラーを発生させる
      f = File.open("hoge.txt")
  rescue SystemCallError => err2
      puts "SystemCallError => err2"
      STDERR.puts err2.message
  end
  
  #ensure→javaとかでいうfinally
  puts "◇ensure→javaとかでいうfinally"
  begin
      #ファイルが無いよエラーを発生させる
      f = File.open("hoge.txt")
  rescue
      puts "エラー2"
  ensure
      puts "後処理"
  end
  
  # 省略式の記載
  puts "◇省略式の記載"
  (f = File.open("hoge.txt")) rescue puts "err"
  
  #例外を発生させる(パラメータ無し)
  puts "◇例外を発生させる(パラメータ無し)"
  begin
      # 「$!(最後にrescueされた例外)」が発生
      raise
  rescue 
      puts "エラー3"
  end
  
  #例外を発生させる(引数:エラーメッセージ)
  puts "◇例外を発生させる(引数:エラーメッセージ)"
  begin
      # RuntimeErrorが発生
      raise "エラーメッセージでーす"
  rescue RuntimeError => err3
      puts "RuntimeError => err3"
      STDERR.puts err3.message
  end
  
  #例外を発生させる(引数:クラス、オブジェクト)
  puts "◇例外を発生させる(引数:クラス、オブジェクト)"
  begin
      # ArgumentErrorが発生
      raise ArgumentError.new("ArgumentErrorです")
  rescue ArgumentError => err4
      puts "ArgumentError => err4"
      STDERR.puts err4.message
  end
  
  #例外を発生させる(独自例外クラスを定義)
  puts "◇例外を発生させる(独自例外クラスを定義)"
  class HogeException < StandardError
      def initialize(arg1)
          @message = arg1
      end
      def message
          @message
      end
      def message=(arg)
          @message = arg
      end
  end
  
  begin
      # 独自例外が発生
      raise HogeException.new("HogeExceptionです")
  rescue HogeException => err5
      puts "HogeException => err5"
      STDERR.puts err5.message
  end


こんな結果になるとφ(--)

  ◇まとめてハンドリング
  エラー1
  ◇エラーナンバーでのハンドリング
  Errno::ENOENT => err1
  No such file or directory - hoge.txt
  ◇クラスでのハンドリング
  SystemCallError => err2
  No such file or directory - hoge.txt
  ◇ensure→javaとかでいうfinally
  エラー2
  後処理
  ◇省略式の記載
  err
  ◇例外を発生させる(パラメータ無し)
  エラー3
  ◇例外を発生させる(引数:エラーメッセージ)
  RuntimeError => err3
  エラーメッセージでーす
  ◇例外を発生させる(引数:クラス、オブジェクト)
  ArgumentError => err4
  ArgumentErrorです
  ◇例外を発生させる(独自例外クラスを定義)
  HogeException => err5
  HogeExceptionです


そんな感じ\(--)/

てか新しい言語を触る度に思うのですが、
なんで同じ概念で同じような書き方で
同じような動きすんのに別の単語を割り振るのでしょうね(--?
オリジナリティが大事なのかもしれませんが
同じ名前(例外で言えば「try」~「catch」~「finally」)で
統一しといてくれると覚えるの楽なのになーと思っちゃいます。
打つ文字数が少なくなってるならまだしも手間は変わらないし。
同じ処理に対してわざわざ別の単語割り振るって
なんかメリットあんの(--?
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Ruby  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事