2012-01-16 40 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