![](/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.