Ruby勉強会@札幌-23に参加しました

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さんのペア)
こういう統計も考えてみるとサクット出せてしまうんですよね。

こんな感じで今回の勉強会も濃い内容で終了しました!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください