代码之家  ›  专栏  ›  技术社区  ›  Jacob Mattison

捕获RubyonRails中的初始化错误

  •  0
  • Jacob Mattison  · 技术社区  · 15 年前

    我想做的是:如果数据库关闭,将用户重定向到一个特殊的错误页面。

    我正在使用带有OCI适配器的Oracle数据库。

    看起来,如果数据库不可用(例如,停止备份),则OCI适配器在我命中控制器之前抛出错误(根据堆栈跟踪,是在设置连接池时)。所以我不能用 rescue_from rescue_action ,即使是在ApplicationController中,也无法到达救援线。

    是否有任何方法可以在比ApplicationController更高的级别(或更早的点)上“包装”初始化或以其他方式挽救特定错误?

    1 回复  |  直到 15 年前
        1
  •  1
  •   cwninja    15 年前

    尝试覆盖 ActionController::Failsafe ,或者在堆栈上粘贴另一个中间件,您应该能够从那里捕获几乎所有的异常,并且可以随意捕获302。

    例子:

    class DbFailsafe
      def new(app)
        @app = app
      end
    
      def call(env)
        @app.call(env)
      rescue DataBaseError => e
        [302, {"Content-Type" => "text/plain", "Location" => "http://otherserver.com/sorrt-the-site-is-down.html"}, ["You are being redirected to http://otherserver.com/sorrt-the-site-is-down.html"]]
      end
    end
    

    在您的环境中

    config.middleware.insert_after ::ActionController::Failsafe, DbFailsafe
    

    我建议(因为我们应该使用5xx而不是3xx)使用js重定向呈现简单页面。这很简单,只需编辑即可 public/500.html .