0

根据异常的家谱。SyntaxError是孩子ScriptError

我希望在我的 rails 应用程序中处理 Syntax 和/或 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

我创建了一个明确的语法错误,它应该优雅地拯救它并做我想做的事情。

4

2 回答 2

1

不幸的是,我不认为它是这样工作的。

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请求处理的方法。

于 2016-05-04T12:10:48.083 回答
0

谢谢!

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

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
于 2016-05-06T09:23:26.163 回答