代码之家  ›  专栏  ›  技术社区  ›  Alexander Azarov

如何跳过在Rails中记录未捕获的异常?

  •  0
  • Alexander Azarov  · 技术社区  · 6 年前

    使用自定义时 exceptions_app rescue_responses ,应用程序可以更好地控制未捕获的异常和来自 DebugExceptions

    例如,应用程序知道如何处理 ActionPolicy::Unauthorized ,在中呈现正确的页面 例外\u应用程序 因此,以下日志是多余的:

    FATAL -- :   
    FATAL -- : ActionPolicy::Unauthorized (Not Authorized):
    FATAL -- :   
    FATAL -- : app/controllers/topics_suggest_controller.rb:47:in `topic_load' 
    

    救援行动

    1 回复  |  直到 6 年前
        1
  •  3
  •   Alexander Azarov    6 年前

    方法1

    删除很有诱惑力 DebugExceptions 来自应用程序Rails堆栈的中间件。

    config/application.rb :

    config.middleware.delete ActionDispatch::DebugExceptions
    

    问题是,正是中间件确定Rails找不到路由并抛出错误 ActionController::RoutingError exceptions_app ,这种方法对你来说是不可行的。

    Not found 当没有找到路线时。

    猴子补丁或改变 ActionDispatch::DebugExceptions 调试异常 从而跳过在中注册的日志异常 rescue_responses : 9343

    我觉得覆盖整个类太多了,所以我选择覆盖它 method log_error

    lib/ext/suppress_exceptions.rb :

    module Ext
      module SuppressExceptions
        private
    
        def log_error(_request, wrapper)
          exception = wrapper.exception
          return if ActionDispatch::ExceptionWrapper.rescue_responses.key? exception.class.name
          super
        end
      end
    end
    

    config/initializers/error_handling.rb :

    require_dependency 'ext/suppress_exceptions'
    
    ActiveSupport.on_load(:action_controller) do
      ActionDispatch::DebugExceptions.prepend Ext::SuppressExceptions
    end