:pぴー.sendせんど(:pぴー, :pぴー)

mokoaki
mokoriso@gmail.com

2017/11/18

Ruby例外記述ルールメモ

参考 Effective Ruby 項目22あたり

class MokoAppError < StandardError; end
class Temp1Error < MokoAppError; end
class Temp2Error < MokoAppError; end
class Temp3Error < MokoAppError; end
begin
  raise Temp1Error, 'aaaaaaa'
rescue Temp1Error => e
  # ログを出力させるのか
  p e.class, e.message, e.backtrace
  
  # リトライするのか
  # retry
  
  # 諦めて更に例外をraiseし、上のスタックに後の処理を任せるのか
  # raise # (superみたいに、現在の例外をそのままraiseしてくれる)
  # raise OtherError
end
class Temp2Error < MokoAppError
  def initialize(msg)
    super("This is #{msg}")
  end
end

begin
  raise Temp2Error.new('message1')
rescue Temp2Error => e
  p e.class, e.message, e.backtrace
end
class Temp3Error < MokoAppError
  def initialize(msg)
    super("This is #{msg}")
  end
end

begin
  raise Temp3Error.new('message1'), 'message2'
rescue Temp3Error => e
  p e.class, e.message, e.backtrace
end
retries = 0

begin
  raise
rescue StandardError
  raise if retries >= 3
  retries += 1
  p "aaaa #{retries}"
  sleep(2 ** retries)
  retry
end
begin
  aaaaa
ensure
  return nil
end
moko =
  catch(:homo) do
    (3..10).each do |a|
      (1..7).each do |b|
        throw(:homo, [a, b]) if a == b
      end
    end
  end

p moko