2017-06-01 56 views
0

我已經從數據庫中獲取的事情,當這樣做之前萬噸的次數等如何捕捉在Rails 500內部服務器錯誤

對於我的特定情況下,我使用a 3rd party連接到一個硬件。 ..無論如何,在出現錯誤的情況下,例如無效ID顯然,我們想要引發異常或救援......但不幸的是,我不知道如何提高它,因爲當它被擊中,一切都太遲了(我認爲)

這裏......

# 
# getting params and saving item above... 
# 

if item.save 
    device = RubySpark::Device.new("FAKEUNITID800") 
    device.function("req", "ITEM") 
    redirect_to controller: 'items', action: 'edit_items' 
end 

如果這是一個有效的ID,一切都會起作用,它會帶你到/edit頁面!但問題是,有一個無效的ID,它只是做...

Completed 500 Internal Server Error in 897ms 

RubySpark::Device::ApiError - Permission Denied: Invalid Device ID: 

我檢查了以下教程

但說實話,他們讓我更加困惑。也許我有這個錯誤的方法。我一直認爲,首先你提出請求,然後你有一個回退的情況,取決於你得到的狀態(即200,500,404)......你從那裏出發。

+2

你就不能換了'RubySpark :: Device'調用'begin' ...'rescue'塊並處理'ApiError'異常? – Brian

回答

2

Rails返回一個500內部服務器錯誤響應,因爲引發了一個異常,它不會如何處理。您無法在Rails中解決「500內部服務器錯誤」,因爲它不是一個例外 - 它是從未捕獲的異常中獲取的框架,以避免數據丟失或不可預知的行爲。

幸運的是,您不必這樣做。你可以只救RubySpark例外:

begin 
    device = RubySpark::Device.new("FAKEUNITID800") 
    device.function("req", "ITEM") 
rescue RubySpark::Device::ApiError => e 
    logger.error(e.message) 
end 

您也可以使用Rails的控制器rescue_from它包裝在before塊整個動作:

class FooController < ApplicationCotnroller 
    rescue_from RubySpark::Device::ApiError, with: :do_something 
    # ... 
end 
+0

您可能想先閱讀Ruby中異常如何工作,但您的問題似乎很困惑。 http://rubylearning.com/satishtalim/ruby_exceptions.html – max

+0

動態錯誤頁面服務於一個非常不同的目的,更多的是虛榮心,而不是處理實際錯誤。 – max

+0

謝謝,這正是我正在尋找的! – dsomel21