どなブロ

エンジニアァのブログです

たのしいRuby 第10章

継続しててエラい!

例外処理

  • 操作の完了を一つずつ確認しなくても、エラーが自動的に検出される
  • エラーの発生場所も同時に報告されるのでデバッグしやすい
  • 正常な処理とエラーの処理を分けて記述できるので、プログラムの見通しが良くなる

例外処理の書き方

begin
  例外を発生させる可能性のある処理
rescue
  例外が起こった場合の処理
end

rescue => 変数という形で変数に例外オブジェクトを得ることもできる

  • 例外発生時に自動的にセットされる変数
変数 意味
$! 最後に発生した例外(例外オブジェクト)
$@ 最後に発生した例外の位置に関する情報
  • 例外オブジェクトのメソッド
メソッド名 意味
class 例外の種類
message 例外のメッセージ
backtrace 例外の発生した位置に関する情報
  • 例外が発生したメソッドにrescue節がない場合は、呼び出し元に遡り例外処理を探す

後処理

  • 例外が起こる起こらないに関わらず実行したい処理がある場合はensure節に記述
begin
  例外を発生させる可能性のある処理
rescue => 変数
  例外処理
ensure
  例外の有無に関わらず実行される処理
end

やり直し

  • rescue節でretryを用いるとbegin以下の処理をもう一度やり直せる
    • ファイルが開けるようになるまで10秒待つなど

rescue修飾子

1 rescue2  # 式1で例外が発生したら式2

例外処理構文の補足

  • 例外処理のためメソッド全体をbegin~endでくくる場合、beginとendを省略してrescue節やensure節が書ける

捕捉する例外を指定する

  • 例外の種類で対応する処理を分ける必要がある時は、複数のrescue節で処理を分ける
begin
  例外を発生させる可能性のある処理
rescue Exception1, Exception2 => 変数
  Exception1またはException2に対する処理
rescue Exception3 => 変数
  Exception3に対する処理
rescue
  それ以外の例外に対する処理
end

例外クラス

  • 例外クラスたくさんある
  • rescue節で例外クラスを指定しなかった場合はStandardErrorとそのサブクラスが捕捉される
  • 自分で例外クラスを作る時はStandardErrorクラスを継承したクラスを作成し、さらにそれを継承するのが一般的

自分で例外を発生させる

  • 自分で例外を発生させるにはraiseメソッドを使う
    • raise メッセージ
      • RuntimeErrorを発生させる。新しく生成された例外オブジェクトにメッセージとして文字列をセットする
    • raise 例外クラス
      • 指定した例外を発生させる
    • raise 例外クラス, メッセージ
      • 指定した例外を発生。新しく生成された例外オブジェクトにメッセージとして文字列をセットする
    • raise
      • rescue節の外ではRutimeError。中では最後に発生した例外をもう一度

代表的な?よく発生すると思われるエラーメッセージ

  • syntax error
    • プログラムに文法的な誤りがある。カッコが閉じられてないなど
  • NameError / NoMethodError
    • メソッドや変数が存在しない
  • ArgumentError
    • メソッドの引数に誤りがある
  • TypeError
    • メソッドが期待しているものとは別のクラスのオブジェクトが渡されている
  • LoagError
    • requireに指定したライブラリを読み込むことができない
  • [BUG]
    • Rubyや拡張ライブラリのバグによるエラー

感想

  • Javaで例外はあやふやなまま適当に使ってたからRubyはちゃんとしたい
  • IDEで例外処理書けって言われてるから書くみたいな…便利だけど成長しない感
  • rescue修飾子便利に使いてい

以上