首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails rescue_from ScriptError

rails rescue_from ScriptError
EN

Stack Overflow用户
提问于 2016-05-04 10:34:17
回答 2查看 505关注 0票数 0

根据家谱的异常。SyntaxErrorScriptError的子级

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

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

发布于 2016-05-04 12:10:48

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

只有在请求处理过程中创建控制器实例之后,才能从rescue_from的异常中拯救(参见源代码这里这里)。您的SyntaxError可能会更早地引发--在给定控制器和依赖类/模块的自动加载期间。因此,除非您试图避免在执行控制器操作时加载代码的语法错误,否则恐怕您运气不佳。

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

代码语言:javascript
复制
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方法。

票数 1
EN

Stack Overflow用户

发布于 2016-05-06 09:23:26

谢谢!

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37025242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档