![](/img/trans.png)
[英]rescue_from ActionController::RoutingError in Rails 4
[英]rails rescue_from ScriptError
根據Exception的家譜。 SyntaxError
是ScriptError
子ScriptError
我希望在我的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.