5月23日に開催された、Ruby勉強会@札幌-23に参加しました。
前日明るくなるまで東京から来た友人と語らい、ちょっと寝不足での参加。
SapporoCafeさんのコーヒーで目覚めました、ありがとうございました。
初めてのRuby読み合わせ
今回は6.4 例外処理から。
例外処理
初めて知ったことメモ
- [begin – rescue – end] が基本、例外がメソッド定義全体にかかる場合はbeginとendを省略できる
- 後置rescue(rescue演算子)も使える
- rescue演算子は乱暴なのであまり使わないで
- 例外構文にelseがある – ログ出力など使うシーンはゼロではない
- 例外クラスを指定せずにrescueした場合は StandardErrorのサブクラスを捕捉する
“例外発生時にexitを呼び出した場合に、ensure節の内容は実行されるかどうか” ということを試しました。
# rescue_exit_test_1.rb begin raise ArgumentError.new('error!!!') rescue ArgumentError => error then puts error.message exit else puts '例外なし' ensure puts '最後の処理' end # => ruby rescue_exit_test_1.rb # error!!! # 最後の処理
exitしてもensure節の内容は実行されています。
exitのリファレンスを確認すると、
exit は例外 SystemExit を発生させ ることによってプログラムの実行を終了させます
とあります。
SystemExitはStandardErrorのサブクラスではないので、例外クラスの指定がないrescueでは補足できませんが、明示的に例外クラスを指定すれば補足可能のようです。
# rescue_exit_test_2.rb begin begin raise ArgumentError.new('error!!!') rescue puts $! exit ensure puts '最後の処理' end rescue puts 'StandardError' rescue SystemExit puts 'ここでexitを握りつぶせる' end puts '最終行の実行' # => ruby rescue_exit_test_2.rb # error!!! # 最後の処理 # ここでexitを握りつぶせる # 最終行の実行
例外処理などを一切行わせたくない場合には、exit! を使う。
終了処理については END{} at_exit{} が用意されている。
at_exitの方が、複数の終了処理を登録できるので使い勝手が良い。
“発生した例外をスタックトレースを含めてラップして、別の例外クラスとしてraiseする方法”についてもやりました。
# re_raise.rb begin begin ae = ArgumentError.new 'message' raise ae rescue some_error = StandardError.new some_error.setbacktrace $@ raise some_error end rescue p $@ end #=> ruby re_raise.rb # ["re_raise.rb:7:in `rescue in <main>'", "re_raise.rb:2:in `<main>'"]
例外処理のところで出てくる、$!や$@の意味がわからなかったとき、このような記号もしっかり調べることのできるるりまサーチはすごいと思いました。最近かなりるりまサーチを使うようになっています。
メソッド
7章:メソッドの冒頭部分を読みました。
メソッドが定義された位置を知る方法
# source_location_sample.rb class Foo def bar p 'bar' end end f = Foo.new p f.method(:bar).source_location #=> ruby source_location_sample.rb # ["source_location_sample.rb", 2]
次回は7.1からになります。
読書会のあとは、h_hiroさんが作成したライブラリ、multisetを使用して、最近話題の
「コンプガチャでコンプするまでにガチャる回数の統計」
をrubyスクリプトで出すと言うペアコーディングの実践がありました。(h_hiroさんとsumimさんのペア)
こういう統計も考えてみるとサクット出せてしまうんですよね。
こんな感じで今回の勉強会も濃い内容で終了しました!