繁体   English   中英

rails rescue_from ScriptError

[英]rails rescue_from ScriptError

根据Exception的家谱。 SyntaxErrorScriptErrorScriptError

我希望在我的rails应用程序中处理语法和/或ScriptError。

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

我做了:

rescue_from ScriptError, :with => :notify_on_landing_page

但是没有用。

屏幕上出现错误: SyntaxError in Bc::Muse::User::ProfileController#show

我创建了一个显式的语法错误,它应该适当地挽救它并做我想做的事情。

不幸的是,我认为它不是那样的。

只有在请求处理期间创建了控制器实例之后,才能使用rescue_from异常(请参见此处此处的源代码)。 您的SyntaxError可能提早得多-在给定控制器和相关类/模块的自动加载期间。 因此,恐怕除非您试图从执行控制器动作期间加载的代码的语法错误中解脱出来,否则您就不走运了。

测试:当您在控制器操作中显式load带有语法错误的文件,并且rescue_from将按预期工作时:

class MyController < ApplicationController
  rescue_from(::SyntaxError) { Rails.logger.error "SYNTAX ERROR!" }

  def index
    load "#{Rails.root}/test.rb"
  end
end

如果将test.rb文件保存在rails根目录中,并在其中添加了故意的语法错误,您将看到rescue_from正确处理了该异常,并且错误消息将出现在日志文件中。

另一方面,如果查看SyntaxError的完整堆栈跟踪,则可能会发现它甚至没有到达ActionController方法进行请求处理。

谢谢!

我添加了一个中间件来实现这一目标。

class RescueSyntaxError
  def initialize(app)
    @app = app
  end

  def call(env)
    @app.call(env)
  rescue SyntaxError => error

    request = Rack::Request.new(env)
    session = request.env['rack.session']
    params = request.params

    if session.try(:[], :user_object)
      ##Do validation stuff
      ...
      [302, {'Location' => '/'}, []]
    end
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM