簡體   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