簡體   English   中英

Ruby中的Sinatra錯誤處理

[英]Sinatra Error Handling in Ruby

我有一個簡單的Sinatra休息,我無法捕獲錯誤。 我也承認我對Ruby和Sinatra很新。

當我在post端點中引發並出錯時,我想報告傳入的文檔。 我需要1)處理post結果中的錯誤(我可以訪問@incoming)或2)將傳入的文檔傳遞給錯誤並在那里報告。

什么是更好的選擇,選項1或選項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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM