rails exception notification gem

https://github.com/smartinez87/exception_notification

Exception family tree

http://ruby.bastardsbook.com/chapters/exception-handling/

Exception
    NoMemoryError
    ScriptError
        LoadError
        NotImplementedError
        SyntaxError
    SignalException
        Interrupt
    StandardError
        ArgumentError
        IOError
            EOFError
        IndexError
            StopIteration
        LocalJumpError
        NameError
            NoMethodError
        RangeError
            FloatDomainError
        RegexpError
        RuntimeError
        SecurityError
        SystemCallError
        SystemStackError
        ThreadError
        TypeError
        ZeroDivisionError
    SystemExit
    fatal

StandardErrorについて

raise 関数に型を渡さない時に発生する例外は、 RuntimeError

raise "エラーメッセージ" # => RuntimeError が発生

やってはいけない

Exceptionクラスをrescueしないこと

  • RubyのExceptionクラスはすべての例外の祖先となるクラスであり
  • NoMemoryError等の致命的なエラー(Rubyの実行そのものが危うくなるエラー)まで含んでいる。

# NG!!
def self.send_daily_summary_to_all_users
  User.all.each do |user|
    begin
      UserMail.daily_summary(user).deliver
    rescue Exception => e ####### NG!!!!!!!!!!!
      ErrorUtility.log_and_notify e
    end
  end
end

# OK
def self.send_daily_summary_to_all_users
  User.all.each do |user|
    begin
      UserMail.daily_summary(user).deliver
    rescue StandardError => e ######## ここ重要
    # rescue => e # これは上と同じ StandardErrorは省略できる
      ErrorUtility.log_and_notify e
    end
  end
end

railsでどこのcustom exception classを配置するか?

lib/以下に配置して

module YourAppExceptions
  class AuthenticationError < StandardError; end
  class InvalidUsername < AuthenticationError; end
end

以下のように使う

raise YourAppExceptions::InvalidUsername

References

results matching ""

    No results matching ""