[英]Sinatra Error Handling in Ruby
我有一個簡單的Sinatra休息,我無法捕獲錯誤。 我也承認我對Ruby和Sinatra很新。
當我在post端點中引發並出錯時,我想報告傳入的文檔。 我需要1)處理post結果中的錯誤(我可以訪問@incoming)或2)將傳入的文檔傳遞給錯誤並在那里報告。
什么是更好的選擇,選項1或選項2?
以下是我的代碼示例:
post ('/result') do
begin
@incoming = JSON.parse(request.body.read)
//do something that causes an error
rescue
e = env['sinatra.error']
url = request.url
ip = request.ip
@actlogpassblock = { :message => e.message,
:path => url,
:ip => ip,
:timestamp => Time.new,
:type => "500",
:sub => "RES",
:payload => @incoming
}
action_log.insert(@actlogpassblock)
status 500
end
end
error do
status 500
e = env['sinatra.error']
url = request.url
ip = request.ip
backtrace = "Application error\n#{e}\n#{e.backtrace.join("\n")}"
@actlogpassblock = { :message => e.message,
:path => url,
:ip => ip,
:timestamp => Time.new,
:type => "500",
:backtrace => backtrace
}
action_log.insert(@actlogpassblock)
{:result => 'Ah Shucks! Something went wrong'}.to_json
end
如果我留在選項1,我如何防止錯誤發現錯誤(因為它似乎現在正在做)
根據文件:
每當從路由塊引發異常時,都會調用錯誤處理程序...
但是,這僅適用於未捕獲的異常。 試試這個:
require 'sinatra'
set :show_exceptions, false
get '/' do
begin
raise ZeroDivisionError
rescue ZeroDivisionError
"rescue clause"
end
end
error do
"sinatra error handler"
end
然后嘗試這個:
get '/' do
raise ZeroDivisionError
end
error do
"sinatra error handler"
end
此外,您可以定制錯誤處理程序以僅捕獲某些異常,從而避免一些異常,例如
error IndexError do ...
要么
error MyCustomException do ...
要么
error 400..510 do
但是對於捕獲所有版本:
error do
你不能阻止在路由塊中發生未捕獲的異常時執行...除非:
但是,如果Sinatra :raise_errors和:show_exceptions配置選項都設置為false,則只會調用錯誤處理程序...
:raise_errors在“test”環境中默認為true,在其他環境中默認為false。
:show_exceptions值在“development”環境中默認為true,在其他環境中默認為false
辛特拉的作者曾說:“這[行為]是有意的。這個想法是錯誤塊會隱藏問題而你通常不希望在開發模式下這樣做。
https://github.com/sul-dlss/sdr-services-app/blob/master/Sinatra-error-handling.md
如果我轉到選項2,如何將傳入傳遞給錯誤?
在錯誤塊內可以看到在路徑塊內創建的@variable。 試試這個:
require 'sinatra'
set :show_exceptions, false
get '/' do
@incoming = "hello world" #create @variable
raise ZeroDivisionError
end
error ZeroDivisionError do
@incoming #retrieve @variable
end
在瀏覽器中輸入URL http://localhost:4567
后,您應該在返回的網頁上看到“hello world”。
之所以有效,是因為@variable在創建@variable時將自身附加到自身的任何對象上; 同樣,當召喚@variable時,它會從當時的任何自身對象中檢索出來。 當Sinatra執行路徑塊或錯誤塊時,它將self設置為同一個對象。
選項2似乎很好,因為它將錯誤處理代碼與應用程序代碼分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.