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さんのペア)
こういう統計も考えてみるとサクット出せてしまうんですよね。
こんな感じで今回の勉強会も濃い内容で終了しました!