我正在Rails中创建一个API,我遇到了一种情况,我想通过向他们传递一些带有错误消息的JSON来提醒用户发生了一些不好的事情。但是,我还想重新提出异常,以便Airbrake(以前的Hoptoad)仍然会收到错误并通知我们,以便我们可以更多地研究这个问题。
我目前正在捕捉错误:
begin
if @myobject.update_attributes(:foo => "bar")
render :json => @myobject, :status => :ok
else
render :json => @myobject.errors, :status => :unprocessable_entity
end
rescue Exception => e
render :json => { :errors => { :message => "Uh oh! Something went wrong." } }
raise e
end
问题是我的客户端永远不会收到JSON消息,因为raise e
阻止它呈现并向它发送一般500错误。
我该如何解决这个问题?
[我的解决方案]
正如以下乔丹所建议的,我只是在我捕获异常时随时在我的代码中调用notify_airbrake(ex)
。但是,我通过在我的ApplicationController
中添加以下内容来略微抽象它,以便我可以在以后轻松地从Airbrake更改为其他内容:
class ApplicationController < ActionController::Base
...
def notify_exception_service(ex)
notify_airbrake(ex)
end
...
end
因此,我只需拨打notify_airbrake(ex)
,而不是notify_exception_service(ex)
。
答案 0 :(得分:2)
正如我在聊天中所说的那样,我认为你不能因为rails如何渲染东西。 当您调用render时,会设置@_something_render_variable,但页面不会直接呈现,还有其他调用。提出异常会明显阻止此流程,实际上会破坏网页的渲染。
更改此行为非常困难,您必须为渲染方法设置别名并对其进行处理,我遇到了类似的问题。
答案 1 :(得分:2)
来自Airbrake gem documentation:
如果你想从控制器记录你自己拯救的任意东西,你可以这样做:
rescue => ex notify_airbrake(ex) flash[:failure] = 'Encryptions could not be rerouted, try again.' end
#notify_airbrake
电话会将通知发送给Airbrake以供日后分析。在控制器中,您可以使用notify_airbrake
方法在代码中的任何其他位置使用Airbrake.notify
。
您不必重新提起异常,以便在Airbrake中进行记录。