根据家谱的异常。SyntaxError是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
我已经创建了一个显式语法错误,它应该优雅地拯救它并做我想做的事情。
发布于 2016-05-04 12:10:48
不幸的是,我不认为它是那样的。
只有在请求处理过程中创建控制器实例之后,才能从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方法。
发布于 2016-05-06 09:23:26
谢谢!
我添加了一个中间件来实现这一点。
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
endhttps://stackoverflow.com/questions/37025242
复制相似问题