2016-05-04 10 views
0

Exceptionの家系図によると、 SyntaxErrorは子供からScriptErrorrails rescue_from ScriptError

私はレールアプリケーションで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

私は明示的な構文エラーを作成して、それが優雅にそれを救出し、私がしたいことを行う必要があります。

答えて

1

残念ながら、私はそれがそのように動作するとは思わない。 rescue_from作品と例外から救出

のみ要求処理中にコントローラのインスタンスを作成した後(ソースコードherehereを参照されたいです)。あなたの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

Ohhはい...それは生産環境ではうまくいかない... – swapab

関連する問題