2012-01-16 36 views
2

我在Rails中创建了一个API,并且遇到了一种情况,我想通过向用户传递一些带有错误消息的JSON来提醒用户发生了某些不良事件。但是,我还想重新提出例外情况,以便Airbrake(以前的Hoptoad)仍然会发现错误并通知我们,以便我们可以更多地查看问题。在Rails控制器中渲染和重新抛出异常

我目前捕捉错误,像这样:

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,这样我可以很容易地从空中刹车改到别的东西在未来:

class ApplicationController < ActionController::Base 
    ... 

    def notify_exception_service(ex) 
    notify_airbrake(ex) 
    end 

    ... 
end 

所以,相反的notify_airbrake(ex)我只是叫notify_exception_service(ex)

回答

2

从空中刹车宝石documentation

如果你想记录你已经从一个控制器救出自己随心所欲的东西,你可以做这样的事情:

rescue => ex 
    notify_airbrake(ex) 

    flash[:failure] = 'Encryptions could not be rerouted, try again.' 
end 

#notify_airbrake通话将通知发送到Airbrake以供日后分析。在您的控制器中,您可以使用代码中其他任何地方的notify_airbrake方法,使用Airbrake.notify

您不必重新引发异常,以便将其记录在Airbrake中。

+1

感谢乔丹。我希望找到一个更好的解决方案,但这正是我所做的。但是,我确实稍微抽象了一下,以便在需要的情况下可以轻松地将Airbrake更改为其他内容。 – 2012-01-17 14:27:20

2

正如我在聊天中所说的,我认为你不能因为轨道如何渲染而感到厌烦。 当您调用渲染时,设置了@_something_render_variable,但该页面不是直接渲染,还有额外的调用。引发异常会阻止这种流动,实际上会中断网页的呈现。

改变这种行为非常困难,你必须别名渲染方法并对其进行处理,我也遇到过类似的问题。

+0

感谢您回答问题,而不仅仅是指第三方应用程序作为停止解决方案 – user566245 2015-12-18 16:41:12