2016-05-04 3 views
0

Согласно генеалогическому древу Исключения. SyntaxError является дочерним по отношению к ScriptErrorrails rescue_from ScriptError

Я хочу обработать синтаксис и/или 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

Я создал явную ошибку синтаксиса, он должен корректно спасти его и делать то, что я хочу.

ответ

1

К сожалению, я не думаю, что это так.

Спасая из исключений с rescue_from работами только после создания экземпляра контроллера во время обработки запроса (см исходного кода here и here). Ваш 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 файл в корневом каталоге рельсах и добавить преднамеренная синтаксическая ошибка в нем, вы увидите, что исключение обрабатывается правильно rescue_from, и сообщение об ошибке будет присутствовать в файле журнала.

С другой стороны, если вы посмотрите на полную трассировку стека вашего SyntaxError, вы, вероятно, увидите, что он даже не доходит до методов ActionController для обработки запроса.

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 
+0

Ничего себе, интересно. Он работает даже в производственной среде? Я думал, Rails нетерпеливо загружает все файлы, начиная с производства, поэтому сначала подумал, что я ожидаю, что это будет работать только в разработке. Но я не уверен. – BoraMa

+0

Ох Да ... Это не работает в производственной среде ... – swapab

 Смежные вопросы

  • Нет связанных вопросов^_^